express.json vs bodyParser.json

107

Piszę stosunkowo nową aplikację i zastanawiam się, której powinienem użyć:

express.json()

lub

bodyParser.json()

Czy mogę założyć, że robią to samo.

Chciałbym po prostu używać, express.json()ponieważ jest już wbudowany.

Soviut
źródło
[email protected] używa tylko parsera treści „1.19.0” jako zależności
Tagi

Odpowiedzi:

249

Wcześniejsze wersje Express zawierały wiele oprogramowania pośredniego w pakiecie. bodyParser był jednym z programów pośrednich, które go pojawiły. Kiedy wydano Express 4.0, zdecydowali się usunąć dołączone oprogramowanie pośrednie z Express i zamiast tego uczynić je osobnymi pakietami. Następnie po zainstalowaniu modułu bodyParser składnia zmieniła się z app.use(express.json())na app.use(bodyParser.json()).

bodyParser został dodany z powrotem do Express w wersji 4.16.0, ponieważ ludzie chcieli, aby był dołączony do Expressu, jak wcześniej. Oznacza to, że nie musisz bodyParser.json()już używać, jeśli korzystasz z najnowszej wersji. Możesz użyć express.json()zamiast tego.

Historia wydań dla wersji 4.16.0 jest tutaj dla zainteresowanych, a żądanie ściągnięcia tutaj .

Mika Sundland
źródło
2
Czy wtedy też możemy to zrobić app.use(express.urlencoded({ extended: true }));?
Robin Métral
2
Ach tak, jest to również wspomniane w powiązanym PR. Świetny!
Robin Métral
1
Czy to oznacza, że ​​wykonują tę samą pracę?
GNETO DOMINIQUE
co się stanie, jeśli użyję zarówno // Data Parsing app.use (express.json ()); app.use (express.urlencoded ({Extended: false})); czy to jest dobre? ponieważ tutorial na youtube mówi mi, żebym używał obu
rickvian
1
@rickvian - Jeśli chcesz, możesz użyć obu. json jest dla JSON, a urlencoded jest dla danych zakodowanych w URL. Jeśli dodasz oba, będziesz mógł przeanalizować oba typy.
Mika Sundland
15

TAK! Poprawny

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
źródło
31
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod.
Brett DeWoody
8

Tak, oba są takie same.

jeśli przejdziesz do pliku node_module / express / lib / express.js

możesz zobaczyć pod zależnościami modułu moduł parsera treści jest już zaimportowany

/**
 * Module dependencies.
 */

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

obiekty i metody wewnątrz modułu bodyparser są dostępne, gdy są eksportowane przy użyciu specjalnego obiektu module.exports

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

jest to dostępne z obiektu ekspresowego po prostu przez wywołanie

express.json()
Shersha Fn
źródło
0

Tak!! możesz użyć obu z nich. Jednak ponieważ express.json()jest już wbudowany express, rozsądniej jest używać express.json()niż bodyParser.json().

anil shresthaa
źródło
-1

Tak!! Ze względu na powszechną opinię ludzi, którzy chcą z powrotem zintegrować parser ciała z ekspresem, najnowsza wersja robi dokładnie to. Powinieneś mieć rację, zakładając, że oba wykonują te same zadania, czyli rozpoznają obiekt żądania przychodzącego jako obiekty JSON. Zapraszam do korzystania z obu.

TanDev
źródło