web-dev-qa-db-ja.com

Angular / Node.js / Expressでクライアント側パラメーターをサーバー側に渡す方法

おそらく非常に基本的な質問ですが、簡単な答えを見つけることができないようです。

特定のURL($http)からのプロミスを要求するAngularのURL_OF_INTERESTを利用するGETメソッドがあります。

このサーバーで、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);

次のようにAngular GETメソッドを使用して、URL_OF_INTERESTと通信できます。

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

ただし、金額、通貨、ソース、説明フィールドは、理想的にはAngularクライアント側アプリケーションから渡される必要があります。

どうすればこれを達成でき、私のエクスプレスアプリケーションはどのようにこのデータを読み取ることができますか?

6
JohnAndrews

次のように、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);   
        }
    });
});
6
Bruno João

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'});
}

回答vs良い解決策

  • サーバーにデータを送信するときは、HTTP [〜#〜] post [〜#〜]が推奨されます。

  • HTTP GETメソッドは、データを送信するのではなく、データを照会することを意味します。そのため、[〜#〜] get [〜#〜]メソッドを使用したHTTPリクエストでは、常に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
}); 

どうぞよろしくお願いいたします。

パラメータを使用して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)
            });

[〜#〜] edit [〜#〜]OR 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;
1
alvarodms