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读取,以便收集所有内容。
为了工作,你需要在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 )