¿Qué hace body-parser con express?

339

No entiendo por qué necesitamos body-parseruna aplicación Express, ya que podemos obtener datos sin usar body-parser. ¿Y qué hace realmente y cómo?

jiten
fuente
54
Para leer los datos HTTP POST, tenemos que usar el módulo de nodo "body-parser". cuerpo-parser es una pieza de middleware expresa de que lee la entrada y lo almacena de una forma como un objeto javascript accesible a través dereq.body
refactor
2
Con express, puede leer cualquier dato dentro de la solicitud HTTP, como encabezados req.headers(matriz), puede leer el cuerpo del paquete http como se req.bodyexplica en @CleanCrispCode y puede leer como parámetro de consulta. req.query.variableAyuda ya que express transforma automáticamente la solicitud en javascript objetos
Fernando Zamperin
3
@refactor: esta podría ser una de las muchas razones por las que tenemos que usar el analizador de cuerpo, pero no dice lo que hace, es decir, que los objetos de solicitud y respuesta HTTP son secuencias y que no son 'legibles' como un solo objeto como si res.bodyla secuencia completa se almacenara res.bodyprimero.
ortonomía
1
Con la versión Express 4.16+, han incluido su propia versión del analizador de cuerpo incorporado para que no tenga que incluir este paquete.
StefanBob

Respuestas:

255

Para manejar la HTTP POSTsolicitud en Express.js versión 4 y superior, debe instalar el módulo de middleware llamado body-parser.

body-parserextrae la parte del cuerpo completo de una secuencia de solicitud entrante y la expone req.body.

El middleware era parte de Express.js anteriormente, pero ahora debe instalarlo por separado.

Este body-parsermódulo analiza los datos codificados JSON, buffer, string y URL enviados mediante HTTP POSTsolicitud. Instale body-parserusando NPM como se muestra a continuación.

npm install body-parser --save

editar en 2019-abril-2: en [email protected] el middleware body-parser incluido con express. para más detalles ver esto

Malatesh Patil
fuente
126
Esta es posiblemente la cosa más floja de la historia. ¿Por qué los desarrolladores principales de Express harían increíblemente difícil que los recién llegados se unieran al hacer que instalen middleware adicional para los casos de uso más comunes en el desarrollo web?
elmt
55
@elmt si quieres algo con opiniones, prueba sails.js
George
1
@ user1063287 sí, lo hace. urlencoded()y en json()realidad son fábricas de middleware que devuelven una función de middleware que invocanext()
Nick Manning
3
No es cojo @elmt, el nodo no es solo para web, se puede usar en computadoras de escritorio, dispositivos móviles, etc., y en estos casos no es un módulo requerido. Node puede adaptarse a su aplicación sin ninguna responsabilidad
fnaquira
28
@fnaquira - Estás confundido. Esto se trata de expresar no nodo.
elmt
85

Sí, podemos trabajar sin él body-parser. Cuando no usa eso, obtiene la solicitud sin procesar, y su cuerpo y encabezados no están en el objeto raíz del parámetro de solicitud. Deberá manipular individualmente todos los campos.

O puede usar body-parser, ya que el equipo express lo mantiene.

Lo que body-parser puede hacer por usted: simplifica la solicitud.
Cómo usarlo: Aquí hay un ejemplo:

Instalar en pc npm install body-parser --save

Así se usa body-parser en express:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

Enlace.

https://github.com/expressjs/body-parser .

Y luego puede obtener el cuerpo y los encabezados en el objeto de solicitud raíz. Ejemplo

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})
Himanshu Sharma
fuente
3
Hola, gracias por la información, ¿puedes publicar un ejemplo de código sin analizador corporal?
Ilyas karim
55

La respuesta aquí lo explica muy detallada y brillantemente, la respuesta contiene:

En breve; body-parser extrae la parte completa del cuerpo de una secuencia de solicitud entrante y la expone req.bodycomo algo más fácil de interactuar. No lo necesitas per se, porque puedes hacer todo eso tú mismo. Sin embargo, lo más probable es que haga lo que quiera y le ahorrará el problema.


Para ir un poco más en profundidad; body-parser le proporciona un middleware que utiliza nodejs / zlib para descomprimir los datos de la solicitud entrante si está comprimido y stream-utils / raw-body para esperar el contenido completo y sin procesar del cuerpo de la solicitud antes de "analizarlo" (esto significa que si no ibas a usar el cuerpo de la solicitud, solo perdiste algo de tiempo).

Después de tener el contenido en bruto, body-parser lo analizará usando una de las cuatro estrategias, dependiendo del middleware específico que decidió usar:

  • bodyParser.raw () : en realidad no analizar el cuerpo, pero sólo expone los contenidos almacenados temporalmente de delante en un búfer de req.body.

  • bodyParser.text () : lee el búfer como texto sin formato y expone la cadena resultante en req.body.

  • bodyParser.urlencoded () : analiza el texto como datos codificados en URL (que es cómo los navegadores tienden a enviar datos de formularios desde formularios regulares establecidos en POST) y expone el objeto resultante (que contiene las claves y los valores) req.body. Para comparacion; en PHP todo esto se hace automáticamente y se expone en $_POST.

  • bodyParser.json () : analiza el texto como JSON y expone el objeto resultante en req.body.

Solo después de establecer el req.bodycontenido deseable, llamará al siguiente middleware en la pila, que luego puede acceder a los datos de la solicitud sin tener que pensar en cómo descomprimirlo y analizarlo.

Puede consultar body-parser github para leer su documentación, contiene información sobre su funcionamiento.

Suraj Jain
fuente
47

Intentemos mantener esto menos técnico.

Supongamos que está enviando datos de un formulario html al servidor node-js, es decir, realizó una solicitud al servidor. El archivo del servidor recibiría su solicitud bajo un objeto de solicitud. Ahora, por lógica, si la consola registra este objeto de solicitud en el archivo de su servidor, debería ver los datos de su formulario en algún lugar, que podrían extraerse entonces, ¡pero vaya! en realidad no lo haces!

Entonces, ¿dónde están nuestros datos? ¿Cómo lo extraeremos si no solo está presente en mi solicitud?

Una explicación simple de esto es que http envía los datos de su formulario en partes que están destinadas a ensamblarse a medida que llegan a su destino. Entonces, ¿cómo extraerías tus datos?

Pero, ¿por qué tomar esta molestia de analizar cada vez manualmente sus datos para trozos y ensamblarlos? Use algo llamado "analizador de cuerpo" que haría esto por usted.

body-parser analiza su solicitud y la convierte a un formato desde el cual puede extraer fácilmente la información relevante que pueda necesitar.

Por ejemplo, supongamos que tiene un formulario de registro en su interfaz. Lo está completando y solicita al servidor que guarde los detalles en alguna parte.

Extraer el nombre de usuario y la contraseña de su solicitud es tan simple como a continuación si usa body-parser.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

Básicamente, body-parser analizó su solicitud entrante, reunió los fragmentos que contienen los datos de su formulario, luego creó este objeto de cuerpo para usted y lo completó con sus datos de formulario.

Abzy
fuente
10

Analiza el cuerpo de la solicitud HTTP. Esto generalmente es necesario cuando necesita saber más que solo la URL que ingresó, particularmente en el contexto de una solicitud HTTP POST o PUT PATCH donde la información que desea está contenida en el cuerpo.

Básicamente es un middleware para analizar JSON, texto sin formato o simplemente devolver un objeto Buffer sin procesar para que lo maneje según lo requiera.

Deepak Patidar
fuente
8

Para obtener acceso a los datos de publicación que tenemos que usar body-parser. Básicamente, qué body-parseres lo que permite que express lea el cuerpo y luego lo analice en un Jsonobjeto que podamos entender.

Satish Kuppili
fuente
7

Todo esto es una cuestión de conveniencia.

Básicamente, si la pregunta fuera '¿ Necesitamos usar body-parser?' La respuesta es no'. Podemos obtener la misma información del cliente después de la solicitud utilizando una ruta más tortuosa que generalmente será menos flexible y aumentará la cantidad de código que tenemos que escribir para obtener la misma información.

Esto es algo así como preguntar '¿ Necesitamos usar expresspara empezar?' Una vez más, la respuesta es no, y de nuevo, todo se reduce a ahorrarnos la molestia de escribir más código para hacer las cosas básicas que express viene con 'incorporado'.

En la superficie: body-parserhace que sea más fácil obtener la información contenida en las solicitudes de los clientes en una variedad de formatos en lugar de hacer que capture los flujos de datos sin procesar y averiguar en qué formato está la información, y mucho menos analizar manualmente esa información en datos utilizables.

Rich Werden
fuente
6

Entendimiento del cuerpo de solicitudes

Al recibir una solicitud POST o PUT, el cuerpo de la solicitud puede ser importante para su aplicación. Obtener los datos del cuerpo es un poco más complicado que acceder a los encabezados de solicitud. El objeto de solicitud que se pasa a un controlador implementa la interfaz ReadableStream. Esta transmisión se puede escuchar o canalizar en otro lugar como cualquier otra transmisión. Podemos obtener los datos directamente de la transmisión al escuchar los eventos de 'datos' y 'finalización' de la transmisión.

El fragmento emitido en cada evento de 'datos' es un Buffer. Si sabe que serán datos de cadena, lo mejor que puede hacer es recopilar los datos en una matriz, luego, al 'final', concatenarlos y encadenarlos.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

Comprender el analizador corporal

Según su documentación

Analice los cuerpos de solicitud entrantes en un middleware antes de sus manejadores, disponibles bajo la propiedad req.body.

Como viste en el primer ejemplo, tuvimos que analizar el flujo de solicitud entrante manualmente para extraer el cuerpo. Esto se vuelve un poco tedioso cuando hay múltiples datos de formularios de diferentes tipos. Entonces usamos el paquete body-parser que hace toda esta tarea bajo el capó.

Proporciona cuatro módulos para analizar diferentes tipos de datos.

Después de tener el analizador de cuerpo sin procesar, usará una de las estrategias anteriores (dependiendo del middleware que haya decidido usar) para analizar los datos. Puede leer más sobre ellos leyendo su documentación.

Después de configurarlo req.bodyen el cuerpo analizado, body-parser invocará next()para llamar al siguiente middleware en la pila, que luego puede acceder a los datos de la solicitud sin tener que pensar en cómo descomprimirlo y analizarlo.

Himansh
fuente