Express抛出错误:“body-parser已弃用undefined扩展”。

211

在我的Node应用程序中,我使用Express。一切都正常,但是在cmd中出现错误。我使用的所有模块都是最新版...

我的代码:

var express = require('express');
var bodyParser = require('body-parser');
var jade = require('jade');
var app = express();
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');
app.use(express.static(__dirname + '/public'));


app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded()); // to support URL-encoded bodies


app.get('/',function(req,res){
    res.render('index.jade');
});

app.get('/login',function(req,res){
    res.render('index.jade');
});

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

app.get('/signup',function(req,res){
    res.render('signup.jade');
});

var env = process.env.PORT || 3000;


app.listen(env, function(req, res){
    console.log('i am working!');
});

错误:

D:\myLogin>node app
body-parser deprecated undefined extended: provide extended option app.js:11:20 //why i am getting this?
i am working!
{ username: 'jbarif@gmail.com', password: 'pass' } // i am getting response

请问有人能帮我理解这个问题吗?


1
@RamprasathSelvam - 是的,确实是这样! - 3gwebtrain
@RamprasathSelvam - 你的代码、模块版本或集成可能有问题,请检查。 - 3gwebtrain
2
我们在哪里投票选出最糟糕的错误信息?特别是考虑到这种情况极有可能发生,这个信息看起来就像一堆随机的单词。 - spechter
12个回答

426

在下一个主要版本的body-parser中,默认值将发生更改,因此您必须明确设置bodyParser.urlencoded()extended。例如:

app.use(bodyParser.urlencoded({ extended: true }));

自从express 4.16.0版本以后,你也可以这样做:

app.use(express.urlencoded({ extended: true }))

6
根据readme,该模块使用qs模块解析请求体,允许像test[foo][bar]=baz这样的嵌套数组语法被解析为{'test': {'foo': {'bar': 'baz'}}} - Bailey Parker
@BaileyParker,你的评论与 extended:true 表达式有关吗?我认为这个表达式是嵌套的。 - Timo
有关其含义,请参见:node.js - Express.js中"bodyParser.urlencoded({ extended: true }))"和"bodyParser.json()"的含义是什么?- Stack Overflow
https://stackoverflow.com/questions/55558402/what-is-the-meaning-of-bodyparser-urlencoded-extended-true-and-bodypar
- undefined

81

注意:express version => 4.16.0开始,body-parser中间件已经重新添加到了方法express.urlencoded()express.json()下。

可以使用以下方式:

app.use(express.urlencoded({extended: true})); 
app.use(express.json());   

2
所以,不需要 npm i body-parser 吗? - Rohit Nishad
2
没错,不需要安装body-parser,它已经包含在内了。 - David

20

错误提示需要在body-parser中提供扩展选项,如下所示:

app.use(bodyParser.urlencoded({ extended: false }))

12

不要使用body-parser

现在的Express新版本中已经内置了它,你可以直接使用express来访问请求体,就像这样:

app.use(express.urlencoded({extended: true}));
app.use(express.json()) // To parse the incoming requests with JSON payloads

因此,您现在可以使用npm uninstall body-parser卸载body-parser。
要获取POST内容,您可以使用req.body
app.post("/yourpath", (req, res)=>{

    var postData = req.body;

    //Or if this doesn't work

    var postData = JSON.parse(req.body);
});

7

如果你遇到了'bodyParser'已经过时。

只需执行以下操作

app.use(express.urlencoded({extended: true})); 
app.use(express.json());

请注意:如果您使用的是4.16.0或更高版本的express。

7
从 Express 4.16.0 版本开始,你需要在 bodyParser.urlencoded() 函数内传入 extended 属性。
//  parse JSON-encoded bodies and URL-encoded bodies
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

请参考npm.js文档页面示例:https://www.npmjs.com/package/body-parser#expressconnect-top-level-generic

如果你正在使用Node v16.xx.x"express": "^4.17.x"及以上版本,则无需再使用bodyParser。它现在已经默认与express集成。 只需按照以下方式操作:

//  parse JSON-encoded bodies and URL-encoded bodies
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

bodyParser已经过时,仍然收到此警告。 - Zain Ul Abidin
这对我很有帮助,因为在从我的应用程序中删除body-parser后,我仍然看到这个错误而感到困惑。 - robm
1
@ZainUlAbidin,只要您使用的是 Node v16.xx.x 和 Express: ^4.17.x 版本,就不再需要使用 Body-Parser。 - tMan44wiz

1
现在不需要显式安装“body-parser”了。这将起作用。
app.use(express.json());

1
如果您正在使用的是Node版本v13.12.0:
app.use(express.urlencoded({ extended: true }))

今天的日期与某人使用的Node版本无关。 - Ghostrydr
这是唯一可行的方法。可悲的是,我在很少的博客文章、论坛等中看到了它,而对此的困惑程度已经达到了顶峰! - ankush981

1
如果您正在使用Node v16.xx.x"express": "^4.17.x",则无需再次使用bodyPerser。它现在已经默认与Express集成。 只需按照下面的步骤进行即可:
//  parse JSON-encoded bodies and URL-encoded bodies
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

0

如果你是在2020年圣诞节之后来到这里的,你只需要在路由声明之后、表达式声明之前将中间件按顺序排列输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接