express.json vs bodyParser.json


99

Sto scrivendo un'app relativamente nuova e mi chiedevo quale dovrei usare:

express.json()

o

bodyParser.json()

Posso presumere che facciano la stessa cosa.

Vorrei solo usarlo express.json()poiché è già integrato.


express@4.17.1 utilizza solo body-parser "1.19.0" come dipendenza
Tagi

Risposte:


233

Le versioni precedenti di Express avevano un sacco di middleware in bundle con esso. bodyParser è stato uno dei middleware che è venuto. Quando è stato rilasciato Express 4.0, hanno deciso di rimuovere il middleware in bundle da Express e renderli invece pacchetti separati. La sintassi è quindi cambiata da app.use(express.json())a app.use(bodyParser.json())dopo l'installazione del modulo bodyParser.

bodyParser è stato aggiunto di nuovo a Express nella versione 4.16.0, perché le persone lo volevano in bundle con Express come prima. Ciò significa che non devi bodyParser.json()più usarlo se sei sull'ultima versione. Puoi usare express.json()invece.

La cronologia del rilascio è per 4.16.0 è qui per coloro che sono interessati, e la richiesta pull qui .


1
Possiamo fare anche app.use(express.urlencoded({ extended: true }));allora?
Robin Métral

1
Ah sì, è menzionato anche nel PR che hai collegato. Grande!
Robin Métral

1
Significa che fanno lo stesso lavoro?
GNETO DOMINIQUE

cosa succede se uso entrambi // Data Parsing app.use (express.json ()); app.use (express.urlencoded ({extended: false})); è buono? perché il tutorial su youtube mi dice di usare entrambi
rickvian

1
@rickvian - Puoi usare entrambi se vuoi. json è per JSON e urlencoded è per dati con codifica URL. Se aggiungi entrambi, sarai in grado di analizzare entrambi i tipi.
Mika Sundland,

14

SÌ! Corretta

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
Sebbene questo snippet di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Brett DeWoody

8

Sì, sono entrambi uguali.

se vai nel file node_module / express / lib / express.js

puoi vedere sotto le dipendenze del modulo il modulo parser del corpo è già importato

/**
 * Module dependencies.
 */

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

gli oggetti ei metodi all'interno del modulo bodyparser sono accessibili in quanto vengono esportati utilizzando lo speciale oggetto module.exports

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

questo è accessibile dall'oggetto express semplicemente chiamando

express.json()

0

Sì!! A causa dell'opinione diffusa delle persone di integrare il body-parser con l'express, l'ultima versione fa esattamente questo. Dovresti avere ragione a presumere che entrambi eseguano le stesse attività, ovvero riconoscere l'oggetto richiesta in arrivo come oggetti JSON. Sentiti libero di usarli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.