bodyParser está en desuso express 4

398

Estoy usando express 4.0 y soy consciente de que se ha extraído el analizador corporal del núcleo express, estoy usando el reemplazo recomendado, sin embargo, estoy obteniendo

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

¿Dónde encuentro estos supuestos middlewares? o no debería estar recibiendo este error?

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
fuente

Respuestas:

730

Significa que el uso del bodyParser() constructor ha quedado en desuso a partir del 19/06/2014.

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

Ahora debe llamar a los métodos por separado.

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

Y así.

Si aún recibe una advertencia urlencoded, debe usar

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

La extendedclave del objeto de configuración ahora debe pasarse explícitamente, ya que ahora no tiene un valor predeterminado.

Si está utilizando Express> = 4.16.0, el analizador de cuerpo se ha agregado nuevamente bajo los métodos express.json()y express.urlencoded().

Ben fortuna
fuente
1
@eslammostafa Puedes usar bodyparser, simplemente no puedes llamar al constructor. Debe llamar a cada método individual.
Ben Fortune
2
@BenFortune gracias Ben, lo entendí, solo estaba preocupado por lo / tmp, pero ahora lo revisé nuevamente, el problema / tmp ocurre solo si usamos bodyParser para analizar formularios multiparte, andrewkelley.me/post/do-not-use -bodyparser-with-express-js.html usaré formidable para formularios multiparte.
schehata
23
¿Qué extendedhacer?
Camilo Martin
1
Una explicación de la diferencia sería útil. También veo a continuación que puedes usar ambos. ¿Pero por qué? ¿Qué consideraciones debes hacer?
Harry Moreno
8
La mejor manera explico extendió cierto es que no utilizan medios extendidos que curl --data "user[email]=foo&user[password]=bar" localhost:3000/login sería recibido por el servidor en el req.bodyque { user[email]: "foo", ...}mientras que req.bodysería {user: {email: "foo", ... }}con extended: true.
reed_de_la_mer
156

¿Quieres cero advertencias ? Úselo así:

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

Explicación : El valor predeterminado de la extendedopción ha quedado en desuso, lo que significa que debe pasar explícitamente el valor verdadero o falso.

smajl
fuente
1
Yo uso esto, todavía obtengo el mensaje "body-parser obsoleto". app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Jeremy Thille
66
Así no es como funcionará. Debe usar app.use () por separado para json y urlencoded
mr-karan
14

En versiones anteriores de express, teníamos que usar:

app.use(express.bodyparser()); 

porque body-parser era un middleware entre nodo y express. Ahora tenemos que usarlo como:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
himanshu yadav
fuente
Creo que querías decir "analizador de cuerpo era middleware"? Express no es un middleware como entiendo
sakhunzai
9

Si está utilizando express> 4.16, puede usar express.json()yexpress.urlencoded()

El express.json()y el express.urlencoded()middleware se han agregado para proporcionar soporte de análisis de cuerpo de solicitud listo para usar. Esto usa el expressjs/body-parsermódulo del módulo debajo, por lo que las aplicaciones que actualmente requieren el módulo por separado pueden cambiar a los analizadores integrados.

Source Express 4.16.0 - Fecha de lanzamiento: 2017-09-28

Con este,

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

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

se convierte,

const express = require('express');

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

body-parser es una pieza de middleware express que lee la entrada de un formulario y la almacena como un objeto javascript accesible a través de req.body 'body-parser' debe estar instalado (a través de npm install --save body-parser) Para obtener más información, consulte: https://github.com/expressjs/body analizador

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

Cuando extendedse establece en verdadero, los cuerpos desinflados (comprimidos) se inflarán; cuando extendedse establece en falso, los cuerpos desinflados se rechazan.

Parth Raval
fuente
2

¿Cuál es su opinión para usar express-generator? Generará un proyecto esqueleto para empezar, without deprecated messagesapareció en su registro

ejecuta este comando

npm install express-generator -g

Ahora, cree una nueva aplicación de inicio Express.js escribiendo este comando your Node projects folder.

express node-express-app

Ese comando le dice a express que genere una nueva aplicación Node.js con el nombre node-express-app.

entonces Go to the newly created project directory, install npm packagesy start the appusando el comando

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

Encontré eso al agregar

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

ayuda, a veces es cuestión de su consulta lo que determina cómo express lo maneja.

Por ejemplo, podría ser que sus parámetros se pasen en la URL en lugar de en el cuerpo

En tal caso, debe capturar los parámetros cuerpo y url y usar el que esté disponible (con preferencia para los parámetros del cuerpo en el caso a continuación)

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

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

Tengo el mismo problema pero esto funciona para mí. Puedes probar esta parte extendida.

Mehedi Abdullah
fuente