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());
引起的,但是正如您所看到的,我在路线。有任何线索吗?
#1 楼
2020年7月更新express.bodyParser()
不再捆绑为Express的一部分。您需要在加载之前单独安装它:npm i body-parser
// then in your app
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// create application/json parser
var jsonParser = bodyParser.json()
// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })
// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
res.send('welcome, ' + req.body.username)
})
// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
// create user in req.body
})
有关更多信息,请参见此处
以下原始信息
必须确保在定义路由之前定义所有配置。如果这样做,则可以继续使用
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' });
});
评论
这对我有用。注意:不幸的是,那里的一些教程(例如我)有些人将路线放在app.configure()之前。就我而言,这是app.get / post等形式,以及包括它们的require()形式。
–弯管人
13年2月24日在21:18
非常感谢,我整天都在解决这个问题。
– jfplataroti
13年7月31日在0:06
从Express 4开始,app.use(app.router)被删除。请参阅文档github.com/visionmedia/express/wiki/New-features-in-4.x
–乔纳森·翁(Jonathan Ong)
2014年5月5日在6:59
从express 4开始,像bodyParser这样的中间件不再与Express捆绑在一起,必须单独安装。您可以在这里找到更多信息:github.com/senchalabs/connect#middleware。
– andrea.rinaldi
2014年9月9日在12:38
谢谢。这个答案已有2年多的历史了,并且仍然在帮助遇到麻烦的人:)
–洛伦佐·马尔孔(Lorenzo Marcon)
15年2月19日在14:51
#2 楼
Express(4.x)的最新版本已将中间件与核心框架分离。如果需要正文解析器,则需要单独安装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())
评论
我最近更新为表达4.x。最初,当我尝试登录req.body时,它向我显示未定义。一旦我安装并使用了body解析器,它将为我提供预期的req.body值。 :)
– Alok Adhao
2015年10月4日5:43
当试图弄清楚为什么我的POST请求不能与json-server一起工作时,我发现这很有用。
– freethebees
16年6月14日在8:47
保存了我的一天,尤其是部分'app.use(bodyParser.json())'。多谢兄弟 ! :D
–neanea
16-09-24在20:18
这应该是公认的答案,因为它完全适用于Express 4!谢谢你,先生!
–合并
16 Dec 30 '18:50
app.use(bodyParser.urlencoded({Extended:false})); app.use(bodyParser.json())救了我!
–布拉格Bajracharya
17年6月30日在17:54
#3 楼
否。您需要在app.use(express.bodyParser())
之前使用app.use(app.router)
。实际上,app.use(app.router)
应该是您最后要拨打的电话。评论
即使将.use调用下的app.use(app.router)移走也无法解决问题:(。
– Masiar
2012年2月7日在17:01
好了,经过一番挣扎之后,我使用app.use(require('connect')。bodyParser())解决了这个问题而不是app.use(express.bodyParser());。
– Masiar
2012年2月8日,0:06
是的,即使使用var router = express.Router();答案也是正确的。
–艾斯提克·艾哈迈德
15年1月30日在17:20
轻微的附录,您仍然应该在app.router之后调用错误处理中间件
–craft
19年2月6日在20:25
略过此评论
– Ke Ke
19年12月31日在8:38
#4 楼
首先,请确保已通过调用以下命令安装了名为“ body-parser”的npm模块:npm install body-parser --save
,然后请确保在调用路由之前已包含以下行
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
评论
如果使用express.json,那么为什么要导入body-parser?
– SanSolo
18/12/27在11:41
#5 楼
Express 4,具有内置的正文解析器。无需安装单独的正文解析器。因此,下面的方法将起作用:export const app = express();
app.use(express.json());
#6 楼
请求标头中的Content-Type确实非常重要,尤其是当您从curl或任何其他工具发布数据时。请确保您正在使用诸如application / x-www-form-urlencoded之类的东西,application / json或其他,取决于您的发布数据。将此字段保留为空会混淆Express。
评论
+1这是我的问题。我正在使用Postman for Chrome测试内置于REST中的JSON api,但是Express每次收到的对象都是空的。事实证明,即使您选择raw> json,Postman默认也不自动添加'Content-Type:application / json'标头。
–乔丹
2013年9月29日上午8:20
@Jordan +1感谢您指出这一点。实际上,我只是检查了标头,即使选择了“ json”,我仍将其设置为“ text / plain”。
–工程师
2013年12月11日20:19在
gh ... 7年后的今天,这仍然让我震惊...
– Shaun314
20-05-24在0:41
#7 楼
正如已经发表的评论一样,我使用app.use(require('connect').bodyParser());
代替了
app.use(express.bodyParser());
解决了我仍然不知道不知道为什么简单的
express.bodyParser()
无法正常工作... 评论
@Masiar这对我不起作用。我正在使用expressjs 4&我得到这样的错误。错误:找不到模块“连接”
–杰亚拉特涅姆(Jeyarathnem Jeyachanthuru)
2014年6月14日14:23在
@JeyTheva的地雷是一个非常老的解决方案,因此在此期间情况可能已发生变化。我建议您尝试通过npm install connect来安装connect模块,然后重试。通过读取错误的输出,这是我唯一能想到的。
– Masiar
2014年6月17日下午6:29
以下是解决此问题的最新文档:npmjs.com/package/body-parser对于遇到此问题的其他人(“快速表达4”),对我有用的是将Content-Type标头设置为application / json。
–格兰特·埃贡
16 Jan 27 '13:16
这是解决此问题的最新文档:npmjs.com/package/body-parser安装了body-parser后,它仍然无法正常工作。当我执行请求时,将Content-Type标头设置为application / json的工作是什么。
–格兰特·埃贡
16年1月27日在13:22
如@GrantEagon所建议,请求中的application / json与text / json可以工作。
–strider
16-4-20在6:50
#8 楼
在调用路由器之前,先添加您的app.js
const app = express();
app.use(express.json());
评论
你救了我这个男人!关键是在呼叫路由器之前添加线路
–迪拜迪士尼
19年8月31日在8:00
这东西救了我。谢谢:)
–法鲁克·法兹(Farrukh Faizy)
19-10-25在23:33
#9 楼
// 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())
#10 楼
似乎人体分析器不再与Express一起提供。我们可能需要单独安装。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!
有关更多信息和示例,请参考git页面https://github.com/expressjs/body-parser。
评论
这似乎是新的Express 4.x格式,对我有用。其他答案中提到的express.bodyParser()在4.x中不起作用。
– DustinB
2014年11月21日在2:30
#11 楼
由于缺少JSON解析器,大部分时间req.body都未定义。const express = require('express');
app.use(express.json());
正文解析器可能缺少
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
,有时由于cros来源而未定义,因此添加它们
const cors = require('cors');
app.use(cors())
#12 楼
万一有人遇到我遇到的同一问题,我使用的是URL前缀,如http://example.com/api/
,它是通过路由器设置的
app.use('/api', router);
,然后我有了以下
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
解决了我问题的是将bodyparser配置放在
app.use('/api', router);
上方最终
// setup bodyparser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
app.use('/api', router);
#13 楼
需要告知express.bodyParser()解析的内容是什么类型。因此,您需要确保在执行POST请求时,要包括“ Content-Type”标头。否则,bodyParser可能不知道如何处理POST请求的主体。如果您使用curl来执行包含主体中某些JSON对象的POST请求,它将看起来像这样:
curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute
如果使用其他方法,只需确保使用适当的约定来设置标头字段。
#14 楼
使用app.use(bodyparser.json());在路由之前。 //。app.use(“ / api”,路线);
#15 楼
您可以尝试在顶部添加以下代码行(在您的require语句之后):app.use(bodyParser.urlencoded({extended: true}));
由于其起作用的原因,请查看文档:https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
评论
我的意思是,您的答案是正确的,但与其他答案没有什么不同。
– dwjohnston
18年8月27日在4:56
#16 楼
今天发生在我身上。以上解决方案均不适用于我。但是,稍作谷歌搜索就可以帮助我解决此问题。我正在为微信第三方服务器编写代码。,当您的node.js应用程序需要读取流式POST数据(例如来自REST客户端的请求)时,事情会变得稍微复杂一些。在这种情况下,请求的属性“可读”将设置为true,并且必须分块读取POST数据才能收集所有内容。
http://www.primaryobjects.com/CMS/Article144
评论
这篇文章提到HTML表单提交与REST Client请求不同。都不都是http请求吗?因此,POST是唯一需要流传输的情况?
– j10
17年2月2日在3:10
#17 楼
浪费了很多时间:取决于客户端请求中的Content-Type
服务器应具有不同的以下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'}));
然后,要求的主体工作正常。
#18 楼
在Express 4中非常简单const app = express()
const p = process.env.PORT || 8082
app.use(express.json())
#19 楼
要工作,您需要在app.use(express.bodyParser())之后使用app.use(app.router),如下所示:app.use(express.bodyParser())
.use(express.methodOverride())
.use(app.router);
评论
您的注释和代码段是矛盾的。首先,您说必须在express.bodyParser之前在app.router上使用app.use,但是代码清楚地表明它是AFTER之后的。那是什么呢?
–李维·罗伯茨(Levi Roberts)
14年8月21日在13:11
对不起。您需要在express.bodyParser之后使用app.router。
– HenioJR
2014年8月27日在12:31
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:41
#20 楼
var bodyParser = require('body-parser');
app.use(bodyParser.json());
这挽救了我的生活。
#21 楼
我用以下方法解决了它:app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});
评论
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:41
#22 楼
此问题可能是因为您没有使用body解析器(链接)var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
#23 楼
在我的情况下,这是因为在添加了路由之后使用了body解析器。正确的代码应为
app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("_method"));
app.use(indexRoutes);
app.use(userRoutes);
app.use(adminRoutes);
#24 楼
app.use(express.json());
将有助于解决rebody.define的问题
评论
可能的答案:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:37
#25 楼
您可以使用快速正文解析器。var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
#26 楼
如果您使用某些外部工具发出请求,请确保添加标题:Content-Type: application/json
评论
这对我有帮助,我和邮递员一起工作,谢谢哥们。
– R. Gurung
19年4月15日在16:41
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:40
#27 楼
这也是一种可能:确保您在app.js(或index.js)文件中的路由之前编写此代码。app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
评论
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:40
#28 楼
如果您发布SOAP消息,则需要使用原始正文解析器:var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.raw({ type: 'text/xml' }));
评论
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:40
#29 楼
建立在@ kevin-xue上的内容类型需要声明。在我的实例中,这仅在IE9中发生,因为XDomainRequest没有设置内容类型,因此bodyparser和expressjs忽略了请求的主体。我通过在将请求传递到正文解析器之前显式设置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());
评论
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:40
#30 楼
归功于@spikeyang的出色回答(下面提供)。阅读该帖子所附的建议文章后,我决定分享我的解决方案。何时使用?
该解决方案要求您使用快递路由器才能享受它:。
如果您尝试使用已接受的答案但没有运气,则只需复制并粘贴此功能即可:
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)
{
});
注意:
对于较大的有效载荷-请使用数组缓冲区(更多@ MDN)
评论
通常使用bodyParser包,并将有效负载转换为主体对象。如其他答案中所提供
–舒尔
17年6月15日在13:32
有关添加到上面的更多解释:stackoverflow.com/a/64386598/8119511
–Ank_247shbm
20-10-16在9:39
评论
这是您的答案:stackoverflow.com/a/64386598/8119511