在带有body-parser的Express.js中,request.body的值是未定义的

时间:2014-11-19 15:13:29

标签: angularjs node.js express httprequest

我遇到了无法诊断的问题。

在服务器上,我有一个使用Express.js的简单URL处理程序:

var express = require('express');
var app = express();

var bodyParser = require('body-parser');
var multer = require('multer');

app.configure(function() {
    app.use(app.router);
    app.use(bodyParser.json()); // see: http://expressjs.com/api.html#req.body
    app.use(bodyParser.urlencoded({
        extended: true
    }));
});

app.post('/submit', function (req, res) {
    console.log(req.body);
});

在客户端,有一个用Angular控制器处理的表单:

$scope.submit = function () {
    // $http.post('/submit', $scope.data); // POST request to send data to the server
    $http({
        method: 'POST',
        url: '/submit',
        data: $scope.data
    });

    console.log('POST /submit ' + JSON.stringify($scope.data));
};

在浏览器的控制台中一切正常:$scope.data有效; Node.js也会按预期响应console.log,但会写undefined,这意味着request.body未定义。

我做错了什么?我该如何解决?

2 个答案:

答案 0 :(得分:2)

如果您使用 Express 3 ,则不必使用正文解析器模块,因为它已与 Express 3捆绑express.bodyParser。你得到一个空体,因为你将app.use(app.router)放在身体解析器之前。

app.configure(function() {
    app.use(express.bodyParser());
    app.use(app.router);
});

这就是您的其他解决方案正常运作的原因:

app.post('/submit', bodyParser.json(), function (req, res) {

答案 1 :(得分:0)

好吧,我刚刚想出了解决方案,它确实有效。 Here使用正文解析器app.post用几句话来解释。所以我将POST请求处理程序定义更改为:

app.post('/submit', bodyParser.json(), function (req, res) {
    console.log(req.body);
});

现在不仅console.log(req.body)返回有效数据,而且它在服务器上正确地反序列化为JSON而没有任何额外的代码(好吧,预期来自Angular + Node对)。