express.json 与 bodyParser.json

Posted

技术标签:

【中文标题】express.json 与 bodyParser.json【英文标题】:express.json vs bodyParser.json 【发布时间】:2018-04-24 05:42:42 【问题描述】:

我正在编写一个相对较新的应用程序,并且想知道应该使用哪个:

express.json()

bodyParser.json()

我可以假设他们做同样的事情吗?

我只想使用 express.json(),因为它已经内置了。

【问题讨论】:

express@4.17.1 只是使用 body-parser “1.19.0” 作为依赖 【参考方案1】:

Express 的早期版本曾经捆绑了很多中间件。 bodyParser 是它附带的中间件之一。当 Express 4.0 发布时,他们决定从 Express 中删除捆绑的中间件,并将它们分开。安装 bodyParser 模块后,语法从 app.use(express.json()) 更改为 app.use(bodyParser.json())

bodyParser 在 4.16.0 版本中被重新添加到 Express 中,因为人们希望它像以前一样与 Express 捆绑在一起。这意味着如果您使用的是最新版本,则不必再使用bodyParser.json()。您可以改用express.json()

4.16.0 的发布历史是 here 供感兴趣的人使用,拉取请求是 here。

【讨论】:

那我们也可以app.use(express.urlencoded( extended: true ));吗? 啊,是的,在您链接的 PR 中也提到了。太好了! 这是否意味着他们做同样的工作? 如果我同时使用两者会怎样 // 数据解析 app.use(express.json()); app.use(express.urlencoded(extended: false ));好吗?因为 youtube 中的教程告诉我两者都使用 @rickvian - 如果你愿意,你可以同时使用。 json 用于 JSON,urlencoded 用于 URL 编码数据。如果您同时添加两者,您将能够解析这两种类型。【参考方案2】:

是的!正确的

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) 
  next(createError(404));
);

// error handler
app.use(function(err, req, res, next) 
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : ;

  // render the error page
  res.status(err.status || 500);
  res.render('error');
);

module.exports = app;

【讨论】:

虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案3】:

是的,两者都是一样的。

如果你进入文件 node_module/express/lib/express.js

你可以在模块依赖下看到body parser模块已经被导入

/**
 * Module dependencies.
 */

var bodyParser = require('body-parser')
//other modules

bodyparser 模块中的对象和方法是可访问的,因为它们是使用特殊对象 module.exports 导出的

exports = module.exports = createApplication;
exports.json = bodyParser.json

这可以通过调用从 express 对象访问

express.json()

【讨论】:

【参考方案4】:

是的!你可以同时使用它们。但是,由于express.json() 现在已经内置在express 中,因此使用express.json() 比使用bodyParser.json() 更明智。

【讨论】:

【参考方案5】:

是的!由于人们普遍认为将 body-parser 与 express 集成回来,最新版本正是这样做的。您应该正确地假设两者都执行相同的任务,即将传入的请求对象识别为 JSON 对象。随意使用。

【讨论】:

以上是关于express.json 与 bodyParser.json的主要内容,如果未能解决你的问题,请参考以下文章

错误:大多数中间件(如 bodyParser)不再与 Express 捆绑

Node.js 表达了对 bodyParser 中间件的正确使用

Node.js 表达了对 bodyParser 中间件的正确使用

bodyparser

express与mongoose基本使用,以及cors解决跨域

bodyParser在node中被弃用解决办法