Express.js req.body未定义

我有这个作为我的快递服务器的configuration

app.use(app.router); app.use(express.cookieParser()); app.use(express.session({ secret: "keyboard cat" })); app.set('view engine', 'ejs'); app.set("view options", { layout: true }); //Handles post requests app.use(express.bodyParser()); //Handles put requests app.use(express.methodOverride()); 

但是,当我在我的路线中询问req.body.something ,我得到一些错误,指出body is undefined 。 这里是一个使用req.body的路由的例子:

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

我读到,这个问题是由缺乏app.use(express.bodyParser()); 但正如你所看到的,我在路线之前叫它。

任何线索?

您必须确保在定义路线之前定义所有configuration。 如果你这样做,你可以继续使用express.bodyParser()

一个例子如下:

 var express = require('express'), app = express(), port = parseInt(process.env.PORT, 10) || 8080; app.configure(function(){ app.use(express.bodyParser()); app.use(app.router); }); app.listen(port); app.post("/someRoute", function(req, res) { console.log(req.body); res.send({ status: 'SUCCESS' }); }); 

Express(4.x)的最新版本已经将中间件从核心框架中分离出来了。 如果你需要body parser,你需要单独安装

 npm install body-parser --save 

然后在您的代码中执行此操作

 var bodyParser = require('body-parser') var app = express() // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) 

不需要。您需要在app.use(app.router)之前使用app.use(express.bodyParser()) app.use(app.router) 。 实际上, app.use(app.router)应该是你最后一次调用的东西。

正如已经发表一个评论,我解决了它使用

 app.use(require('connect').bodyParser()); 

代替

 app.use(express.bodyParser()); 

我仍然不知道为什么简单的express.bodyParser()不工作…

首先确保你已经安装了名为“body-parser”的npm模块,通过调用:

 npm install body-parser --save 

然后确保在呼叫路线之前包含以下线路

 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.json()); 

内容types在请求头是非常重要的,尤其是当你从curl或任何其他工具发布数据。

确保你使用的应用程序/ x-www-form-urlencoded,application / json或其他东西,这取决于你的发布数据。 将此字段留空将使Express表示混淆。

express.bodyParser()需要被告知是什么types的内容是它的parsing。 因此,您需要确保在执行POST请求时包含“Content-Type”标题。 否则,bodyParser可能不知道如何处理你的POST请求。

如果你正在使用curl来执行一个包含一些JSON对象的POST请求,它会看起来像这样:

 curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute 

如果使用其他方法,只要确保使用任何适当的约定来设置该头字段。

看起来身体分析器不再是快递。 我们可能需要单独安装。

 var express = require('express') var bodyParser = require('body-parser') var app = express() // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) // parse application/vnd.api+json as json app.use(bodyParser.json({ type: 'application/vnd.api+json' })) app.use(function (req, res, next) { console.log(req.body) // populated! 

有关更多信息和示例,请参阅https://github.com/expressjs/body-parser的git页面。;

今天发生在我身上。 上述解决scheme都不适用于我。 但有一点Google使我帮助解决了这个问题。 我为微信第三方服务器编码。

当node.js应用程序需要读取stream式POST数据(例如来自REST客户端的请求)时,情况会稍微复杂一些。 在这种情况下,请求的属性“可读”将被设置为true,POST数据必须以块的forms读取,以便收集所有内容。

http://www.primaryobjects.com/CMS/Article144

为了工作,你需要在app.use(express.bodyParser())之后app.use(app.router) ,如下所示:

 app.use(express.bodyParser()) .use(express.methodOverride()) .use(app.router); 
 var bodyParser = require('body-parser'); app.use(bodyParser.json()); 

这节省了我的一天。

 // Require body-parser (to receive post data from clients) var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) 

浪费了很多时间:

取决于您的客户端请求中的内容types
服务器应该有不同的,下面的app.use()之一:

 app.use(bodyParser.text({ type: 'text/html' })) app.use(bodyParser.text({ type: 'text/xml' })) app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) app.use(bodyParser.json({ type: 'application/*+json' })) 

资料来源: https : //www.npmjs.com/package/body-parser#bodyparsertextoptions

例:

对我来说,在客户端,我有下面的标题:

 Content-Type: "text/xml" 

所以,在服务器端,我用:

 app.use(bodyParser.text({type: 'text/xml'})); 

然后,req.body工作正常。

如果您发布SOAP消息,则需要使用原始的正文parsing器:

 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); app.use(bodyParser.raw({ type: 'text/xml' })); 

build立在@ kevin-xue上说,内容types需要声明。 在我的例子中,这只发生在IE9上,因为XDomainRequest没有设置内容types ,所以bodyparser和expressjs忽略了请求的主体。

我通过在将请求传递到正文parsing器之前显式设置content-type来解决此问题,如下所示:

 app.use(function(req, res, next) { // IE9 doesn't set headers for cross-domain ajax requests if(typeof(req.headers['content-type']) === 'undefined'){ req.headers['content-type'] = "application/json; charset=UTF-8"; } next(); }) .use(bodyParser.json()); 

感谢@spikeyang的伟大的答案(下面提供)。 阅读后附的build议文章后,我决定分享我的解决scheme。

何时使用?

这个解决scheme需要你使用快速路由器来享受它。所以:如果你尝试着使用接受的答案而没有运气,只需使用复制和粘贴这个function:

 function bodyParse(req, ready, fail) { var length = req.header('Content-Length'); if (!req.readable) return fail('failed to read request'); if (!length) return fail('request must include a valid `Content-Length` header'); if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired var body = ''; // for large payloads - please use an array buffer (see note below) req.on('data', function (data) { body += data; }); req.on('end', function () { ready(body); }); } 

并称之为:

 bodyParse(req, function success(body) { }, function error(message) { }); 

注意:对于大载荷 – 请使用数组缓冲区( more @ MDN )