express.json vs bodyParser.json

99

Estou escrevendo um aplicativo relativamente novo e queria saber qual devo usar:

express.json()

ou

bodyParser.json()

Posso presumir que eles fazem a mesma coisa.

Eu gostaria de usar apenas express.json()como já está integrado.

Soviut
fonte
[email protected] usa apenas o analisador de corpo “1.19.0” como uma dependência
Tagi

Respostas:

233

As versões anteriores do Express costumavam ter muitos middlewares incluídos. bodyParser foi um dos middlewares que surgiu. Quando o Express 4.0 foi lançado, eles decidiram remover o middleware empacotado do Express e torná-los pacotes separados. A sintaxe então mudou de app.use(express.json())paraapp.use(bodyParser.json()) após a instalação do módulo bodyParser.

bodyParser foi adicionado de volta ao Express na versão 4.16.0, porque as pessoas queriam empacotá-lo com o Express como antes. Isso significa que você não precisa bodyParser.json()mais usar se estiver com a versão mais recente. Você pode usar em seu express.json()lugar.

O histórico de lançamento para 4.16.0 está aqui para aqueles que estão interessados, e a solicitação de pull aqui .

Mika Sundland
fonte
1
Podemos fazer também app.use(express.urlencoded({ extended: true }));?
Robin Métral
1
Sim, também é mencionado no PR que você vinculou. Ótimo!
Robin Métral
1
Isso significa que eles fazem o mesmo trabalho?
GNETO DOMINIQUE
e se eu usar // Análise de dados app.use (express.json ()); app.use (express.urlencoded ({extended: false})); isso é bom? porque o tutorial no youtube me diz para usar os dois
rickvian
1
@rickvian - Você pode usar os dois se quiser. json é para JSON e urlencoded é para dados codificados por URL. Se você adicionar os dois, poderá analisar os dois tipos.
Mika Sundland
14

SIM! Corrigir

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;
Oleg Mikhailenko
fonte
31
Embora este snippet de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro e essas pessoas podem não saber os motivos de sua sugestão de código.
Brett DeWoody
8

Sim, ambos são iguais.

se você entrar no arquivo node_module / express / lib / express.js

você pode ver nas dependências do módulo o módulo do analisador de corpo já foi importado

/**
 * Module dependencies.
 */

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

os objetos e métodos dentro do módulo bodyparser são acessíveis à medida que são exportados usando o objeto especial module.exports

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

isso é acessível a partir do objeto expresso apenas chamando

express.json()
Shersha Fn
fonte
0

Sim!! Devido à opinião generalizada das pessoas em integrar o analisador de corpo de volta ao expresso, a versão mais recente faz exatamente isso. Você deve estar certo ao supor que ambos executam as mesmas tarefas, ou seja, reconhecer o objeto de solicitação recebido como objetos JSON. Sinta-se à vontade para usar qualquer um.

TanDev
fonte