bodyParser está obsoleto expresso 4

398

Estou usando o express 4.0 e estou ciente de que o analisador de corpo foi retirado do núcleo expresso, estou usando a substituição recomendada, mas estou obtendo

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

Onde encontro esse suposto middleware? ou eu não deveria estar recebendo esse erro?

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
fonte

Respostas:

730

Isso significa que o uso do bodyParser() construtor foi descontinuado em 19/06/2014.

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

Agora você precisa chamar os métodos separadamente

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

E assim por diante.

Se você ainda estiver recebendo um aviso, urlencodedprecisará usar

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

A extendedchave do objeto de configuração agora precisa ser passada explicitamente, pois agora não possui valor padrão.

Se você estiver usando Express> = 4.16.0, o analisador de corpo foi adicionado novamente nos métodos express.json()e express.urlencoded().

Ben Fortune
fonte
11
@eslammostafa Você pode usar bodyparser, você simplesmente não pode chamar o construtor. Você precisa chamar cada método individual.
Ben Fortune
2
@ BenFortune obrigado Ben, entendi, eu só estava preocupado com a coisa / tmp, mas agora verifiquei novamente, o problema / tmp só acontece se usamos bodyParser para analisar formulários de várias partes, andrewkelley.me/post/do-not-use -bodyparser-with-express-js.html Vou usar formidável então para formulários de várias partes.
schehata
23
O que extendedfaz?
Camilo Martin
11
uma explicação da diferença seria útil. Também vejo abaixo que você pode usar os dois. Mas por que? Que considerações você deve fazer?
Harry Moreno
8
A melhor maneira de explicar o extended true é que o não uso de meios estendidos que curl --data "user[email]=foo&user[password]=bar" localhost:3000/login seriam recebidos pelo servidor da req.bodymesma forma { user[email]: "foo", ...}que req.bodyseria {user: {email: "foo", ... }}com extended: true.
22915 Reed_de_la_mer
156

Deseja zero avisos ? Use-o assim:

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

Explicação : O valor padrão da extendedopção foi descontinuado, o que significa que você precisa transmitir explicitamente o valor verdadeiro ou falso.

smajl
fonte
11
Eu uso isso, ainda recebendo a mensagem "body-parser deprecated". app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Jeremy Thille
6
Não é assim que vai funcionar. Você precisa usar app.use () separadamente para JSON e urlencoded
mr-karan
14

Nas versões mais antigas do express, tivemos que usar:

app.use(express.bodyparser()); 

porque body-parser era um middleware entre node e express. Agora temos que usá-lo como:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
himanshu yadav
fonte
Eu acho que você queria dizer "analisador de corpo era middleware"? Express não é middleware como eu entendo
sakhunzai
9

Se você estiver usando express> 4.16, poderá usar express.json()eexpress.urlencoded()

O express.json()e o express.urlencoded()middleware foram adicionados para fornecer suporte imediato à análise do corpo da solicitação. Isso usa o expressjs/body-parsermódulo do módulo abaixo, para que os aplicativos que atualmente exigem o módulo separadamente possam mudar para os analisadores internos.

Source Express 4.16.0 - Data de lançamento: 28-09-2017

Com isso,

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

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

torna-se,

const express = require('express');

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
Sridhar
fonte
8

body-parser é um middleware expresso que lê a entrada de um formulário e o armazena como um objeto javascript acessível através de req.body 'body-parser' deve ser instalado (via npm install --save body-parser) Para obter mais informações, consulte: 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

Quando extendeddefinido como true, os corpos desinflados (comprimidos) serão inflados; Quando extendeddefinido como falso, os corpos desinflados são rejeitados.

Parth Raval
fonte
2

Qual é a sua opinião para usar express-generator, ele irá gerar um projeto esqueleto para começar, without deprecated messagesapareceu em seu log

execute este comando

npm install express-generator -g

Agora, crie o novo aplicativo iniciante do Express.js, digite este comando your Node projects folder.

express node-express-app

Que expressa comando tell para gerar novo aplicativo Node.js com o nome node-express-app.

então Go to the newly created project directory, install npm packagese start the appusando o comando

cd node-express-app && npm install && npm start
Basheer AL-MOMANI
fonte
1

Eu descobri que ao adicionar

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

ajuda, às vezes é uma questão de sua consulta que determina como o Express lida com isso.

Por exemplo, pode ser que seus parâmetros sejam passados ​​no URL e não no corpo

Nesse caso, você precisa capturar o corpo e parâmetros url e usar o que estiver disponível (com preferência pelos parâmetros body no caso abaixo)

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });
Ian Mbae
fonte
-1

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

Eu tenho o mesmo problema, mas este trabalho para mim. Você pode tentar esta parte estendida.

Mehedi Abdullah
fonte