bodyParser устарел экспресс 4

398

Я использую Express 4.0, и я знаю, что анализатор тела был удален из ядра Express, я использую рекомендованную замену, однако я получаю

body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:15:12 body-parser deprecated urlencoded: explicitly specify "extended: true" for extended parsing node_modules/body-parser/index.js:74:29

Где я могу найти это предполагаемое промежуточное ПО? или я не должен получать эту ошибку?

var express     = require('express');
var server      = express();
var bodyParser  = require('body-parser');
var mongoose    = require('mongoose');
var passport    = require('./config/passport');
var routes      = require('./routes');

mongoose.connect('mongodb://localhost/myapp', function(err) {
    if(err) throw err;
});

server.set('view engine', 'jade');
server.set('views', __dirname + '/views');

server.use(bodyParser()); 
server.use(passport.initialize());

// Application Level Routes
routes(server, passport);

server.use(express.static(__dirname + '/public'));

server.listen(3000);
Melbourne2991
источник

Ответы:

730

Это означает , что с помощью bodyParser() конструктора был устаревшим , по состоянию на 2014-06-19.

app.use(bodyParser()); //Now deprecated

Теперь вам нужно вызывать методы отдельно

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

И так далее.

Если вы все еще получаете предупреждение, urlencodedвам нужно использовать

app.use(bodyParser.urlencoded({
  extended: true
}));

extendedКлючевой объект конфигурации Теперь необходимо явно прошло, так как в настоящее время не имеет значения по умолчанию.

Если вы используете Express> = 4.16.0, анализатор тела был повторно добавлен в соответствии с методами express.json()и express.urlencoded().

Бен Фортуна
источник
1
@eslammostafa Вы можете использовать bodyparser, просто не можете вызвать конструктор. Вам нужно вызывать каждый отдельный метод.
Бен Фортуна
2
@BenFortune спасибо Бен, я понял, я просто переживал за вещь / tmp, но теперь я снова проверил, проблема / tmp возникает, только если мы использовали bodyParser для анализа многочастных форм, andrewkelley.me/post/do-not-use -bodyparser-with-express-js.html я буду использовать тогда грозный для многочастных форм.
Schehata
23
Что делает extended?
Камило Мартин
1
объяснение разницы было бы полезно. Я также вижу ниже, что вы можете просто использовать оба. Но почему? Какие соображения вы должны сделать?
Гарри Морено
8
Лучший способ объяснить расширенное значение true состоит в том, что не используются расширенные средства, curl --data "user[email]=foo&user[password]=bar" localhost:3000/login которые будут получены сервером, req.bodyкак { user[email]: "foo", ...}если req.bodyбы они были {user: {email: "foo", ... }}с extended: true.
reed_de_la_mer
156

Хотите ноль предупреждений ? Используйте это так:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

Объяснение : Значение параметра по умолчанию extendedустарело, что означает необходимость явной передачи значения true или false.

Смайл
источник
1
Я использую это, все еще получая сообщение «body-parser устарело». app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Джереми Тилле
6
Это не так, как это будет работать. Вам нужно использовать app.use () отдельно для json и urlencoded
mr-karan
14

В старых версиях Express нам приходилось использовать:

app.use(express.bodyparser()); 

потому что body-parser был промежуточным ПО между узлом и экспрессом. Теперь мы должны использовать это как:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
Химаншу Ядав
источник
Я думаю, что вы хотели сказать "body-parser было промежуточным ПО"? Экспресс - это не промежуточное ПО, как я понимаю
sakhunzai
9

Если вы используете экспресс> 4.16, вы можете использовать express.json()иexpress.urlencoded()

Программное обеспечение express.json()и express.urlencoded()промежуточное программное обеспечение были добавлены для обеспечения встроенной поддержки синтаксического анализа тела запроса. При этом используется expressjs/body-parserмодуль модуля внизу, поэтому приложения, которым в данный момент требуется модуль отдельно, могут переключаться на встроенные парсеры.

Source Express 4.16.0 - Дата выхода: 2017-09-28

С этим,

const bodyParser  = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

становится,

const express = require('express');

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
Шридхар
источник
8

body-parser - это часть промежуточного программного обеспечения Express, которое читает входные данные формы и сохраняет его как объект javascript, доступный через req.body body-parser. (через npm install --save body-parser). Для получения дополнительной информации см .: https://github.com/expressjs/body. -parser

   var bodyParser = require('body-parser');
   app.use(bodyParser.json()); // support json encoded bodies
   app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

Когда extendedустановлено значение true, тогда спущенные (сжатые) тела будут раздуваться; когда extendedустановлено значение false, спущенные тела отклоняются.

Парт Равал
источник
2

Как вы думаете, чтобы использовать экспресс-генератор, он сгенерирует скелетный проект, который without deprecated messagesпоявился в вашем журнале?

запустить эту команду

npm install express-generator -g

Теперь создайте новое начальное приложение Express.js, введя эту команду в your Node projects folder.

express node-express-app

Эта команда скажите express, чтобы сгенерировать новое приложение Node.js с именем node-express-app.

затем Go to the newly created project directory, install npm packagesи с start the appпомощью команды

cd node-express-app && npm install && npm start
Башир Аль-Момани
источник
1

Я обнаружил, что при добавлении

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

помогает, иногда вопрос о том, как экспресс обрабатывает его, зависит от ваших запросов.

Например, может случиться так, что ваши параметры передаются в URL, а не в теле

В таком случае вам нужно захватить как параметры body, так и параметры url и использовать любой доступный параметр (предпочтение отдается параметрам body в приведенном ниже случае)

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });
Ян Мбаэ
источник
-1

app.use(bodyParser.urlencoded({extended: true}));

У меня та же проблема, но эта работа для меня. Вы можете попробовать эту расширенную часть.

Мехеди Абдулла
источник