使用Express.js无法从请求中获取POST正文

kev*_*nco 26 javascript json node.js express sails.js

我正在研究一个带有NodeJS和Express的API(以及更多东西,如mongo,套接字等),但我坚持一个非常简单的步骤,我相信,我只是想从POST req对象获取信息,但是我试图访问时收到错误req.body

这就是我所拥有的:

var express     = require('express'),
    http        = require('http'),
    path        = require('path'),
    fs          = require('fs'),
    io          = require('socket.io');
    dynroute    = require('dynroute');

var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(app.router);
app.use(express.bodyParser());

app.post('/user', function(req, res) {

    console.log(JSON.stringify(req.body));
    res.send(req.body.self);
});

http.createServer(app).listen(app.get('port'), function ()
{
    console.log('App Server is now running at:' + app.get('port'));     
});
Run Code Online (Sandbox Code Playgroud)

console.log(JSON.stringify(req.body));我得到undefinedres.send(req.body.self);我得到TypeError: Cannot read property 'self' of undefined

我已经seaching这种类型的错误,通常的问题是,人们不包括app.use(express.bodyParser());中间件,我还使用tryied app.use(express.urlencoded());app.use(express.json());,也没有任何工作.

如果我这样做,console.log(req)我可以看到整个对象但我无法看到body或从客户端执行POST请求时传递的任何内容(我将其作为JSON传递).

*我知道我可以在Node中使用restifysails.js构建API,但我希望自己做所有事情,以便我可以从经验中学习.

谢谢

编辑:

我不得不把bodyparser中间件放在中间件之前app.router,修复它!

Ren*_*ama 32

bodyParser中间件移到中间件上方router!

var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(app.router);
Run Code Online (Sandbox Code Playgroud)

  • 如果你想在今天使用bodyParser时避免烦人的(但是暂时的)弃用警告,你可以改为`app.use(express.urlencoded()); app.use(express.json());`做同样的事情. (5认同)

Aka*_*ash 8

Content-Type = "application/json" 应该是其中之一 Request Headers

  • 事实证明,对我来说,以及在Google Chrome中使用原生fetch API并不会将内容类型标头默认为application/json,因此服务器端不会发生正文解析,因为传入请求必须被解释为文本. (2认同)

小智 5

BodyParser 不再与 Express 捆绑在一起

npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
Run Code Online (Sandbox Code Playgroud)

  • 要解析 json 正文,请添加以下行:`app.use(bodyParser.json())` (3认同)