bodyParser є застарілим експресом 4


398

Я використовую Express 4.0 і мені відомо, що аналізатор тіла був виведений з експрес-ядра, я використовую рекомендовану заміну, однак я отримую

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);

Відповіді:


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ключ об'єкта config повинен бути явно переданий, оскільки він тепер не має значення за замовчуванням.

Якщо ви використовуєте 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 я буду використовувати foridable тоді для багаточастинкових форм.
schehata

23
Що робить extended?
Каміло Мартін

1
пояснення різниці було б корисним. Я також бачу нижче, що ви можете просто використовувати обидва. Але чому? Які міркування слід зробити?
Гаррі Морено

8
Кращий спосіб я пояснюю продовжений вірно, що не використовує розширені засоби , які були 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параметра застаріле, тобто вам потрібно явно передати істинне або хибне значення.


1
Я використовую це, все ще отримуючи повідомлення про "застарілий аналізатор тіла". app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Джеремі Тілль

6
Це не так буде працювати. Вам потрібно використовувати app.use () окремо для json та urlencoded
mr-karan

14

У старих версіях Express нам довелося використовувати:

app.use(express.bodyparser()); 

тому що body-parser був проміжним програмним забезпеченням між вузлом та express. Тепер ми повинні використовувати його так:

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

Я думаю, ти хотів сказати, що "body-parser був проміжним програмним забезпеченням"? Експрес - це не програмне забезпечення, як я розумію
sakhunzai

9

Якщо ви використовуєте express> 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

тіло-аналізатор є частиною спеціального проміжного шару , який зчитує інформацію і зберігає його в якості об'єктів JavaScript , доступного через форму в req.body «тілі-парсером» повинен містити (через npm install --save body-parser) Для отримання додаткової інформації див: https://github.com/expressjs/body -частник

   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

Ця команда Tell 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, а не в тіло

У такому випадку потрібно фіксувати як параметри тіла, так і URL-адреси та використовувати те, що є в наявності (з перевагою параметрів тіла у нижченаведеному випадку)

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}));

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

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