J'envoie des données id en utilisant la méthode post à mon serveur de noeud. Mais req.body n'est pas défini dans mon fichier de noeud

Mon index.html ressemble à ceci:

<html ng-app="IMDBApp">
<body>
    <div ng-controller="testController as movieFetcher" class="container">
        <input type="text" ng-model="movieFetcher.movieId"></input>
        <button ng-click="movieFetcher.sendId(movieFetcher.movieId)">Fetch Details</button>
    </div>
</body>

Mon contrôleur angulaire ressemble à ceci:

angular.module('testApp', []).controller('testController',['$http',function($http){
this.movieId = 197;
this.sendId = function(id){
    $http.post('/test',id).success(function(response){
     // does something on response
    });
}; }]);

Mon serveur de noeud ressemble à:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.text());
app.listen(8080);


app.post('/test', function(req, res) {
 var i = req.body;
 var url = 'http://www.imdb.com/title/tt' + i + '/';
 // i shows as undefined
 console.log("i is",i,"url is",url);
 res.send(url);
});
1
Mohit 7 mars 2016 à 23:20

3 réponses

Meilleure réponse

$http.post envoie par défaut un type de contenu de application/json, puisque vous utilisez text/plain, vous devrez envoyer explicitement un type de contenu de text/plain.

$http({
  method: 'POST',
  url: '/test',
  headers: {
    'Content-Type': 'text/plain'
  },
  data: id
})

Depuis $http Docs Définition des en-têtes HTTP

Le service $ http ajoutera automatiquement certains en-têtes HTTP à toutes les demandes. Ces valeurs par défaut peuvent être entièrement configurées en accédant à l'objet de configuration $ httpProvider.defaults.headers, qui contient actuellement cette configuration par défaut:

  • $httpProvider.defaults.headers.common (headers that are common for all requests): Accept: application/json, text/plain, * / *

  • $ httpProvider.defaults.headers.post: (en-tête par défaut pour les requêtes POST) Type de contenu: application / json

  • $ httpProvider.defaults.headers.put (valeurs par défaut d'en-tête pour les requêtes PUT) Type de contenu: application / json

0
peteb 7 mars 2016 à 20:43

Convertissez le JSON entrant en une chaîne, var body = ''; req.on ('données', fonction (données) {corps + = données;}); req.on ('end', function () {var params = JSON.parse (body); // callback function callback;});

Ensuite, lisez vos données comme body.id

0
Raghu 7 mars 2016 à 20:53

Mettez à jour votre server.js pour

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static(__dirname + '/public'));

Au lieu de

app.use(express.static(__dirname + '/public'));
app.use(bodyParser.text());

Ensuite ça devrait aller.

0
Solomon Ayoola 7 mars 2016 à 20:39