我将其作为Express服务器的配置

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());引起的,但是正如您所看到的,我在路线。

有任何线索吗?

评论

这是您的答案:stackoverflow.com/a/64386598/8119511

#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