Cosa fa body-parser con express?


339

Non capisco perché abbiamo bisogno body-parserdi un'applicazione Express, poiché possiamo ottenere dati senza usare body-parser. E cosa fa effettivamente e come?


54
per leggere i dati POST HTTP, dobbiamo usare il modulo del nodo "body-parser". body-parser è un middleware espresso che legge l'input di un modulo e lo memorizza come oggetto javascript accessibile attraversoreq.body
refactor

2
Con express puoi leggere tutti i dati all'interno della richiesta HTTP, come header req.headers(array), puoi leggere il corpo del pacchetto http come req.bodyspiegato da @CleanCrispCode e puoi leggere come parametro di query req.query.variable, aiuta poiché express trasforma automaticamente la richiesta in javascript oggetti
Fernando Zamperin,

3
@refactor - questo potrebbe essere uno dei tanti motivi per cui dobbiamo usare body parser, ma non dice quello che fa, cioè che gli oggetti di richiesta e risposta HTTP sono flussi e che non sono "leggibili" come oggetto singolo come se res.bodyl'intero stream non fosse bufferizzato per res.bodyprimo.
ortonomia

1
Con Express versione 4.16+ hanno incluso la propria versione di body-parser integrata in modo da non dover inserire questo pacchetto.
StefanBob,

Risposte:


255

Per gestire la HTTP POSTrichiesta in Express.js versione 4 e successive, è necessario installare il modulo middleware chiamato body-parser.

body-parserestrae l'intera parte del corpo di un flusso di richieste in entrata e lo espone req.body.

Il middleware faceva parte di Express.js in precedenza ma ora è necessario installarlo separatamente.

Questo body-parsermodulo analizza i dati codificati JSON, buffer, stringa e URL inviati utilizzando la HTTP POSTrichiesta. Installare body-parserutilizzando NPM come mostrato di seguito.

npm install body-parser --save

modificare in 2019-aprile-2: in express@4.16.0 il middleware body-parser in bundle con express. per maggiori dettagli vedi questo


126
Questa è probabilmente la cosa più debole di sempre. Perché gli sviluppatori core di Express renderebbero incredibilmente difficile per i nuovi arrivati ​​entrare a far parte installando middleware aggiuntivo per i casi d'uso più comuni nello sviluppo web?
elmt

5
@elmt se vuoi qualcosa con le opinioni, prova sails.js
George

1
@ user1063287 sì. urlencoded()e in json()realtà sono fabbriche di middleware che restituiscono una funzione di middleware che invocanext()
Nick Manning il

3
Non è lame @elmt, il nodo non è solo per il web, può essere utilizzato su desktop, mobile, ecc. E in questi casi non è un modulo richiesto. Node può adattarsi alla tua applicazione senza alcuna responsabilità
fnaquira,

28
@fnaquira - Sei confuso. Si tratta di esprimere non nodo.
elmt

85

Sì, possiamo lavorare senza body-parser. Quando non si utilizza, si ottiene la richiesta non elaborata e il corpo e le intestazioni non si trovano nell'oggetto root del parametro request. Dovrai manipolare individualmente tutti i campi.

Oppure puoi usare body-parser, come il team espresso lo sta mantenendo.

Cosa può fare body-parser per te: semplifica la richiesta.
Come si usa: ecco un esempio:

Installare npm install body-parser --save

Ecco come usare body-parser in 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 }));

Link.

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

Quindi puoi ottenere body e header nell'oggetto richiesta root. Esempio

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
Ehi, grazie per le informazioni, puoi pubblicare un esempio di codice senza body parser?
Ilyas karim,

55

La risposta qui lo spiega in modo molto dettagliato e brillante, la risposta contiene:

In breve; body-parser estrae l'intera parte del corpo di un flusso di richieste in entrata e lo espone req.bodycome qualcosa di più facile da interfacciare. Non ne hai bisogno di per sé, perché potresti fare tutto da solo. Tuttavia, molto probabilmente farà ciò che vuoi e ti farà risparmiare il disturbo.


Per andare un po 'più in profondità; body-parser offre un middleware che utilizza nodejs / zlib per decomprimere i dati della richiesta in arrivo se è compresso e stream-utils / raw-body in attesa del contenuto completo e grezzo del corpo della richiesta prima di "analizzarlo" (ciò significa che se non avresti usato il corpo della richiesta, hai perso tempo).

Dopo avere i contenuti non elaborati, body-parser lo analizzerà utilizzando una delle quattro strategie, a seconda del middleware specifico che hai deciso di utilizzare:

  • bodyParser.raw () : in realtà non analizzare il corpo, ma solo espone il contenuto tamponate su da prima in un buffer su req.body.

  • bodyParser.text () : legge il buffer come testo normale ed espone la stringa risultante su req.body.

  • bodyParser.urlencoded () : analizza il testo come dati codificati URL (che è il modo in cui i browser tendono a inviare i dati dei moduli da moduli regolari impostati su POST) ed espone l'oggetto risultante (contenente chiavi e valori) req.body. Per confronto; in PHP tutto ciò viene automaticamente eseguito ed esposto $_POST.

  • bodyParser.json () : analizza il testo come JSON ed espone l'oggetto risultante req.body.

Solo dopo aver impostato il req.bodycontenuto desiderato chiamerà il middleware successivo nello stack, che può quindi accedere ai dati della richiesta senza dover pensare a come decomprimerlo e analizzarlo.

Puoi fare riferimento al github del parser del corpo per leggere la loro documentazione, che contiene informazioni sul suo funzionamento.


47

Proviamo a mantenere questo meno tecnico.

Supponiamo che tu stia inviando i dati del modulo html al server node-js, ovvero che hai fatto una richiesta al server. Il file del server riceverà la tua richiesta sotto un oggetto richiesta. Ora, per logica, se consoli questo oggetto richiesta nel tuo file server, dovresti vedere i dati del tuo modulo in qualche punto, che potrebbero essere estratti allora, ma whoa! in realtà no!

Quindi, dove sono i nostri dati? Come lo estrarremo se non è solo presente nella mia richiesta.

Una semplice spiegazione a questo è che http invia i dati del tuo modulo in parti che devono essere assemblate non appena raggiungono la loro destinazione. Quindi come estrarresti i tuoi dati.

Ma perché prenderti questa seccatura di analizzare manualmente i tuoi dati per pezzi e assemblarli. Usa qualcosa chiamato "body-parser" che farebbe questo per te.

body-parser analizza la tua richiesta e la converte in un formato dal quale puoi facilmente estrarre le informazioni rilevanti di cui potresti aver bisogno.

Ad esempio, supponiamo che tu abbia un modulo di iscrizione nel tuo frontend. Lo stai compilando e stai richiedendo al server di salvare i dettagli da qualche parte.

L'estrazione di nome utente e password dalla tua richiesta è semplice come di seguito se usi body-parser.

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

Quindi, in pratica, body-parser ha analizzato la tua richiesta in arrivo, assemblato i blocchi contenenti i dati del modulo, quindi creato questo oggetto body per te e riempito con i dati del modulo.


10

Analizza il corpo della richiesta HTTP. Questo di solito è necessario quando è necessario conoscere più dell'URL che si preme, in particolare nel contesto di una richiesta HTTP POST o PUT PATCH in cui le informazioni desiderate sono contenute nel corpo.

Fondamentalmente si tratta di un middleware per l'analisi di JSON, testo semplice o semplicemente la restituzione di un oggetto Buffer non elaborato da gestire come richiesto.


8

Per poter accedere ai dati dei post dobbiamo usare body-parser. Fondamentalmente ciò body-parserche è che consente a espresso di leggere il corpo e quindi analizzarlo in un Jsonoggetto che possiamo capire.


7

Questi sono tutti una questione di convenienza.

Fondamentalmente, se la domanda fosse: "Abbiamo bisogno?" di usare body-parser?' La risposta è no'. Possiamo ottenere le stesse informazioni dalla richiesta post-cliente utilizzando un percorso più tortuoso che sarà generalmente meno flessibile e aumenterà la quantità di codice che dobbiamo scrivere per ottenere le stesse informazioni.

Questo è lo stesso del chiedere 'Do we need di usare expressper cominciare?' Ancora una volta, la risposta è no, e di nuovo, tutto si riduce a salvarci il fastidio di scrivere più codice per fare le cose di base che esprimono viene fornito con "built-in".

In superficie - body-parserrende più facile ottenere le informazioni contenute nelle richieste dei clienti in una varietà di formati invece di farti catturare i flussi di dati grezzi e capire in quale formato sono le informazioni, e tanto meno analizzare manualmente tali informazioni in dati utilizzabili.


6

Capire l'ente delle richieste

Quando si riceve una richiesta POST o PUT, il corpo della richiesta potrebbe essere importante per l'applicazione. Accedere ai dati del corpo è un po 'più complicato rispetto all'accesso alle intestazioni delle richieste. L'oggetto richiesta passato a un gestore implementa l'interfaccia ReadableStream. Questo flusso può essere ascoltato o reindirizzato altrove come qualsiasi altro flusso. Possiamo estrarre i dati direttamente dallo stream ascoltando gli eventi "data" e "end" dello stream.

Il blocco emesso in ogni evento "data" è un buffer. Se sai che saranno i dati delle stringhe, la cosa migliore da fare è raccogliere i dati in un array, quindi alla fine, concatenarli e stringerli.

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

Comprensione del body-parser

Secondo la sua documentazione

Analizzare i corpi delle richieste in arrivo in un middleware prima dei gestori, disponibili nella proprietà req.body.

Come hai visto nel primo esempio, abbiamo dovuto analizzare manualmente il flusso di richieste in entrata per estrarre il corpo. Questo diventa un po 'noioso quando ci sono più dati di forma di tipi diversi. Quindi usiamo il pacchetto body-parser che fa tutto questo sotto il cofano.

Fornisce quattro moduli per analizzare diversi tipi di dati

Dopo aver utilizzato il parser del corpo del contenuto non elaborato, verrà utilizzata una delle strategie sopra descritte (a seconda del middleware che si è deciso di utilizzare) per analizzare i dati. Puoi leggere di più su di loro leggendo la loro documentazione.

Dopo aver impostato il req.bodycorpo analizzato, body-parser invocherà next()per richiamare il middleware successivo nello stack, che potrà quindi accedere ai dati della richiesta senza dover pensare a come decomprimerlo e analizzarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.