bodyParser弃用Express 4


398

我正在使用Express 4.0,并且我知道主体解析器已从Express核心中移除,我正在使用推荐的替代产品,但是我得到了

body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:15:12 body-parser deprecated urlencoded: explicitly specify "extended: true" for extended parsing node_modules/body-parser/index.js:74:29

我在哪里可以找到这个所谓的中间件?还是我不应该得到这个错误?

var express     = require('express');
var server      = express();
var bodyParser  = require('body-parser');
var mongoose    = require('mongoose');
var passport    = require('./config/passport');
var routes      = require('./routes');

mongoose.connect('mongodb://localhost/myapp', function(err) {
    if(err) throw err;
});

server.set('view engine', 'jade');
server.set('views', __dirname + '/views');

server.use(bodyParser()); 
server.use(passport.initialize());

// Application Level Routes
routes(server, passport);

server.use(express.static(__dirname + '/public'));

server.listen(3000);

Answers:


730

这意味着自2014年6月19日起,不赞成使用bodyParser() 构造函数

app.use(bodyParser()); //Now deprecated

您现在需要分别调用方法

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

等等。

如果仍然收到警告,则urlencoded需要使用

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

extended现在的配置对象的关键需要明确的被传递,因为它现在已经没有默认值。

如果您使用的快递> = 4.16.0,身体解析器已根据这些方法重新加入express.json()express.urlencoded()


1
@eslammostafa您可以使用bodyparser,只是不能调用构造函数。您需要调用每个单独的方法。
Ben Fortune

2
@BenFortune感谢Ben,我明白了,我只是担心/ tmp的问题,但是现在我再次检查,/ tmp问题仅在我们使用bodyParser解析多部分表单时才发生,andrewkelley.me / post /请勿使用-bodyparser-with-express-js.html我将使用强大的多部分表单。
schehata 2014年

23
怎么extended办?
卡米洛·马丁

1
对差异进行解释会有所帮助。我还在下面看到您可以同时使用两者。但为什么?您应该考虑什么?
哈里·莫雷诺2014年

8
我来解释一下扩展真正最好的办法是不使用扩展装置 curl --data "user[email]=foo&user[password]=bar" localhost:3000/login 将由服务器接收req.body{ user[email]: "foo", ...},而req.body{user: {email: "foo", ... }}extended: true
reed_de_la_mer

156

想要零警告?像这样使用它:

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

说明extended不建议使用该选项的默认值,这意味着您需要显式传递true或false值。


1
我用它,仍然收到“不赞成使用人体分析器”的消息。app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
杰里米·锡耶

6
那不是它的工作方式。您需要分别对json和urlencoded使用app.use()
mr-

14

在旧版的express中,我们必须使用:

app.use(express.bodyparser()); 

因为body-parser是node和express之间的中间件。现在我们必须像这样使用它:

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

我认为您想说“ body-parser是中间件”?快递不是我所了解的中间件
sakhunzai

8

body-parser是一种表达中间件,它可以读取表单的输入并将其存储为可通过req.body “ body-parser” 访问的javascript对象(通过npm install --save body-parser)。有关更多信息,请参见:https : //github.com/expressjs/body -解析器

   var bodyParser = require('body-parser');
   app.use(bodyParser.json()); // support json encoded bodies
   app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

extended被设置为真,然后放气(压缩)机构将被充气; 当extended设置为false时,放气的物体将被拒绝。


8

如果您使用express> 4.16,则可以使用express.json()express.urlencoded()

express.json()express.urlencoded()中间件已被添加到提供请求主体的解析支持外的开箱。这使用了expressjs/body-parser下面的模块模块,因此当前单独需要该模块的应用程序可以切换到内置解析器。

Source Express 4.16.0-发布日期:2017-09-28

有了这个,

const bodyParser  = require('body-parser');

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

变成

const express = require('express');

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

2

您对使用express-generator会产生骨架项目的想法是什么,without deprecated messages出现在您的日志中

运行此命令

npm install express-generator -g

现在,通过在中键入以下命令来创建新的Express.js入门应用程序your Node projects folder

express node-express-app

该命令告诉express生成名称为的新Node.js应用程序node-express-app

然后Go to the newly created project directoryinstall npm packagesstart the app使用命令

cd node-express-app && npm install && npm start

1

我发现在添加

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

帮助,有时由查询决定Express如何处理它。

例如,可能是您的参数在URL中而不是在正文中传递

在这种情况下,您需要同时捕获bodyurl参数并使用任何可用的参数(在以下情况下,请优先选择body参数)

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.