express.json проти bodyParser.json


100

Я пишу відносно новий додаток і міркував, який із них я повинен використовувати:

express.json()

або

bodyParser.json()

Чи можу я припустити, що вони роблять те саме.

Я хотів би просто використовувати, express.json()як це вже вбудовано.


express@4.17.1 просто використовує парсер тіла “1.19.0” як залежність
Tagi

Відповіді:


234

У попередніх версіях Express раніше в комплекті було багато проміжного програмного забезпечення. bodyParser був одним із проміжних програм, який його отримав. Коли Express 4.0 був випущений, вони вирішили видалити вбудований проміжний пакет із Express і замість нього зробити окремі пакети. Потім синтаксис змінився з app.use(express.json())на app.use(bodyParser.json())після встановлення модуля bodyParser.

bodyParser було додано до Express у версії 4.16.0, тому що люди хотіли, щоб він був у комплекті з Express, як і раніше. Це означає, що вам більше не доведеться користуватися, bodyParser.json()якщо ви використовуєте останню версію. Ви можете використовувати express.json()замість цього.

Історія випуску для 4.16.0 тут для тих, хто зацікавлений, а запит на витяг тут .


1
app.use(express.urlencoded({ extended: true }));Тоді ми також можемо це зробити ?
Робін Метраль,

1
Ах, так, це також згадується у PR, який ви зв’язали. Чудово!
Робін Метраль,

1
Це означає, що вони виконують однакову роботу?
GNETO DOMINIQUE

що якщо я використовую обидва // Розбір даних app.use (express.json ()); app.use (express.urlencoded ({extension: false})); це добре? тому що підручник у youtube говорить мені використовувати обидва
rickvian

1
@rickvian - Ви можете використовувати обидва, якщо хочете. json призначений для JSON, а urlencoded - для даних, закодованих за допомогою URL. Якщо ви додасте обидва, ви зможете проаналізувати обидва типи.
Міка Сандленд

14

ТАК! Правильно

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
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду.
Бретт Девуді

8

Так, обидва однакові.

якщо ви зайдете у файл node_module / express / lib / express.js

ви можете бачити під залежностями модуля модуль парсеру тіла вже імпортований

/**
 * Module dependencies.
 */

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

об'єкти та методи всередині модуля bodyparser доступні, оскільки вони експортуються за допомогою спеціального об'єктного модуля.exports

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

це доступно з експрес-об'єкта лише за допомогою виклику

express.json()

0

Так!! Завдяки широко поширеній думці людей про інтеграцію парсеру для тіла назад із експрессом, останній випуск робить саме це. Ви повинні мати рацію припустити, що обидва вони виконують однакові завдання, тобто розпізнавати об’єкт вхідного запиту як об’єкти JSON. Не соромтеся використовувати будь-який.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.