express.json frente a bodyParser.json


100

Estoy escribiendo una aplicación relativamente nueva y me preguntaba cuál debería usar:

express.json()

o

bodyParser.json()

¿Puedo asumir que ellos hacen lo mismo?

Me gustaría usarlo express.json()porque ya está integrado.


express@4.17.1 solo usa el analizador corporal "1.19.0" como una dependencia
Tagi

Respuestas:


235

Las versiones anteriores de Express solían tener una gran cantidad de middleware incluido. bodyParser fue uno de los middlewares que vino. Cuando se lanzó Express 4.0, decidieron eliminar el middleware incluido de Express y convertirlos en paquetes separados. La sintaxis luego cambió de app.use(express.json())a app.use(bodyParser.json())después de instalar el módulo bodyParser.

bodyParser se volvió a agregar a Express en la versión 4.16.0, porque la gente quería que se incluyera con Express como antes. Eso significa que no tiene que usar bodyParser.json()más si está en la última versión. Puede usar express.json()en su lugar.

El historial de versiones de 4.16.0 está aquí para aquellos que estén interesados, y la solicitud de extracción aquí .


1
¿Podemos hacer también nosotros app.use(express.urlencoded({ extended: true }));entonces?
Robin Métral

1
Ah, sí, también se menciona en el PR que vinculó. ¡Excelente!
Robin Métral

1
¿Eso significa que hacen el mismo trabajo?
GNETO DOMINIQUE

¿Qué pasa si uso tanto // Data Parsing app.use (express.json ()); app.use (express.urlencoded ({extendido: falso})); ¿esta bien? porque el tutorial en youtube me dice que use ambos
rickvian

1
@rickvian: puede usar ambos si lo desea. json es para JSON y urlencoded es para datos codificados en URL. Si agrega ambos, podrá analizar ambos tipos.
Mika Sundland

14

¡SI! Correcto

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;

31
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.
Brett DeWoody

8

Sí, ambos son iguales.

si entra en el archivo node_module / express / lib / express.js

puede ver en las dependencias del módulo, el módulo del analizador corporal ya está importado

/**
 * Module dependencies.
 */

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

los objetos y métodos dentro del módulo bodyparser son accesibles ya que se exportan utilizando el módulo de objetos especiales.

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

esto es accesible desde el objeto express simplemente llamando

express.json()

0

¡¡Si!! Debido a la opinión generalizada de la gente de volver a integrar el analizador corporal con el expreso, la última versión hace exactamente esto. Debería tener razón al asumir que ambos realizan las mismas tareas, es decir, reconocer el objeto de solicitud entrante como objetos JSON. Siéntase libre de usar cualquiera de los dos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.