如何将客户端参数传递到服务器端的Angular/Node.js/Express

问题描述:

可能是一个非常基本的问题,但我似乎无法找到一个简单的答案。如何将客户端参数传递到服务器端的Angular/Node.js/Express

我有一个使用Angular的$http的GET方法,它要求从特定网址(URL_OF_INTEREST)承诺。

在此服务器上,我运行一个可处理GET请求的脚本server.js

server.js

var express = require('express');  // call express 
var app  = express();     // define our app using express 
var bodyParser = require('body-parser'); 
var stripe  = require("stripe")("CUSTOM_TEST_TOKEN"); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

var port = process.env.PORT || 8080;   
var router = express.Router();    // get an instance of the express Router 

router.get('/', function(req, res, next) { 

    var stripeToken = "CUSTOM_PAYMENT_TOKEN"; 

    var charge = stripe.charges.create({ 
     amount: 1100, // amount in cents, again 
     currency: "usd", 
     source: stripeToken, 
     description: "Example charge" 
    }, function(err, charge) { 
     if (err && err.type === 'StripeCardError') { 
      res.json(err); 
     } else { 
      res.json(charge); 
     } 
    }); 
}); 

app.use(function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 

    next(); 
}) 

app.use('/api', router); // register our route 
app.listen(port); // start our server 
console.log('Magic happens on port ' + port); 

我可以使用角GET方法如下与URL_OF_INTEREST通信:

$http.get('URL_OF_INTEREST') 
     .success(
      function(success){ 
       console.log(success) 
      }) 
     .error(
      function(error){ 
       console.log(error) 
      }); 

然而,字段量,货币,源和说明需要理想地从Angular客户端应用程序传递。

这是如何实现的?我的快速应用程序如何读取这些数据?

您需要在您的GET调用传递数据便接踵而来:

var data = { 
    amount: 3, 
    currency: 2, 
    source: 3, 
    description: 4 
}; 

$http.get('URL_OF_INTEREST', data) // PASS THE DATA AS THE SECOND PARAMETER 
    .success(
     function(success){ 
      console.log(success) 
     }) 
    .error(
     function(error){ 
      console.log(error) 
     }); 

而在后端,你可以得到你的URL参数便接踵而来:

router.get('/', function(req, res, next) { 

    var amount = req.query.amount; // GET THE AMOUNT FROM THE GET REQUEST 

    var stripeToken = "CUSTOM_PAYMENT_TOKEN"; 

    var charge = stripe.charges.create({ 
     amount: 1100, // amount in cents, again 
     currency: "usd", 
     source: stripeToken, 
     description: "Example charge" 
    }, function(err, charge) { 
     if (err && err.type === 'StripeCardError') { 
      res.json(err); 
     } else { 
      res.json(charge); 
     } 
    }); 
}); 
+0

明白了!但是,您如何在服务器端读取数据呢? – JohnAndrews

+0

我刚刚编辑了答案。只需使用“req.query.amount”来获取您的数据。 – vinagreti

+1

奇怪,我越来越没有定义... – JohnAndrews

您可以创建一个JS然后使用jQuery的$.paramhttp://api.jquery.com/jquery.param/)轻松将它们序列化为URL查询字符串:

var parameters = { 
    amount: 123, 
    description: 'test' 
}; 

并在您电话$http

$http.get('URL_OF_INTEREST'+'?'+$.param(parameters)) 
     .success(
      function(success){ 
       console.log(success) 
      }) 
     .error(
      function(error){ 
       console.log(error) 
      }); 

编辑或者如果你不想使用jQuery:

$http.get('URL_OF_INTEREST', { params: parameters }) 
     .success(
      function(success){ 
       console.log(success) 
      }) 
     .error(
      function(error){ 
       console.log(error) 
      }); 

在服务器端,只需要使用req对象得到参数:

var amount = req.query.amount; 
var description = req.query.description; 
+0

你不需要使用JQuery来解决这个问题。 – vinagreti

+0

你说得对。但这是解决问题的一种方法,它很有效。 – alvarodms

回答VS很好的解决方案

  • HTTP POST 将数据发送到服务器是优选的。

  • HTTP GET方法表示查询数据,不发送数据。正因为如此,HTTP请求与GET方法将始终有request.body为空。但仍然可以通过GET使用查询字符串将数据发送到服务器。你的情况:

客户

$http.get('url_to_be_hit', { name : 'Mr. X'}) 
    .success(function(res){ //response }) 
    .error(function(err){ //failure }); 

服务器

app.get('/url_to_be_hit', function(req,res,next){ 
    //req.query.name 
}); 

快乐帮助!

+2

哇''req.query'而不是'req.body'或'req.params'。经过这么长时间的搜寻,这终于解决了我的问题!谢谢! –

HTTP GET 方法

客户:

$http.get('/login', {params: {name: 'ABCXYZ'}}) 
    .success(
     function(success){ 
      console.log(success) 
     }) 
    .error(
     function(error){ 
      console.log(error) 
     }); 

服务器

router.get('/login', function(req, res, next) { 
    var username = req.query.name; 
    res.json({'status': 200, 'msg': 'success'}); 
} 

HTTP POST 方法

客户:

$http.post('/login', {params: {name: 'ABCXYZ'}}) 
    .success(
     function(success){ 
      console.log(success) 
     }) 
    .error(
     function(error){ 
      console.log(error) 
     }); 

服务器

router.post('/login', function(req, res, next) { 
    var username = req.body.params.name; 
    res.json({'status': 200, 'msg': 'success'}); 
} 
+0

谢谢你! :) –