2015-10-13 7 views
6

Prawdopodobnie bardzo podstawowe pytanie, ale nie mogę znaleźć prostej odpowiedzi.Jak przekazywać parametry po stronie klienta do strony serwera w Angular/Node.js/Express

Mam metodę GET wykorzystującą Angulara $http, która żąda obietnicy z konkretnego adresu URL (URL_OF_INTEREST).

Na tym serwerze uruchamiam skrypt ekspresowy server.js, który może obsłużyć żądania GET.

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

mogę komunikować się z URL_OF_INTEREST za pomocą metody GET kątowym następująco:

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

Jednak pola kwota, waluta, źródło i opis potrzeba najlepiej przenieść z aplikacji Angular po stronie klienta.

Jak można to osiągnąć i jak moja wyraźna aplikacja może odczytać te dane?

Odpowiedz

5

Trzeba przekazać dane w wywołaniu uzyskać jak folow:

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

I w backend, można uzyskać parametry adresu URL jako folow:

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

Got it! Ale jak odczytujesz dane teraz po stronie serwera? – JohnAndrews

+0

Właśnie zredagowałem odpowiedź. Po prostu użyj "req.query.amount", aby uzyskać swoje dane. – vinagreti

+1

Dziwne, dostaję niezdefiniowane ... – JohnAndrews

1

można utworzyć JS obiekt z parametrami, a następnie użyj jQuery's $.param (http://api.jquery.com/jquery.param/), aby łatwo przekształcić je w ciąg zapytania adresu URL:

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

I na $http rozmowy:

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

EDIT: lub jeśli nie chcesz używać jQuery:

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

Na stronie serwera, wystarczy użyć obiektu do req Uzyskaj parametry:

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

Nie musisz używać JQuery, aby rozwiązać ten problem. – vinagreti

+0

Masz rację. Ale jest to sposób na rozwiązanie problemu i działa. – alvarodms

3

Odpowiedź vs dobre rozwiązanie

  • HTTP POSTjest preferowany podczas wysyłania danych do serwera.

  • Metoda HTTP GET oznacza wyszukiwanie danych, nie wysyłanie danych. Z tego powodu żądanie HTTP z metodą GET zawsze będzie miało pusty request.body. Ale nadal dane mogą być wysyłane do serwera przez GET za pomocą ciągu zapytania.W twoim przypadku:

Client

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

Server

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

Szczęśliwy Pomagamy!

+2

Wow .. 'req.query' zamiast' req.body' lub 'req.params'. Po tak długich poszukiwaniach w końcu udało mi się rozwiązać mój problem! Dziękuję Ci! –

5

HTTP GETmetoda

Klient:

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

Server:

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

HTTP POSTmetoda

Klient:

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

Server:

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

Dzięki człowieku !! :) –

Powiązane problemy