Co parser body robi z express?


339

Nie rozumiem, dlaczego potrzebujemy body-parseraplikacji Express, ponieważ możemy uzyskiwać dane bez użycia body-parser. A co to właściwie robi i jak?


54
aby odczytać dane HTTP POST, musimy użyć modułu węzła „body-parser”. body-parser to ekspresowe oprogramowanie pośredniczące, które odczytuje dane wejściowe formularza i przechowuje je jako obiekt javascript dostępny przezreq.body
refactor

2
Dzięki ekspresowi możesz odczytać dowolne dane w żądaniu HTTP, takie jak nagłówki req.headers(tablica), możesz odczytać req.bodytreść pakietu HTTP zgodnie z wyjaśnieniem @CleanCrispCode i możesz odczytać jako parametr zapytania req.query.variable, pomaga, ponieważ express automatycznie przekształca żądanie w javascript obiekty
Fernando Zamperin,

3
@refactor - może to być jeden z wielu powodów, dla których musimy używać parsera treści, ale nie mówi on, co robi, tj. że obiekty żądania i odpowiedzi HTTP są strumieniami i że nie są „czytelne” jako pojedynczy obiekt tak jakby res.bodycały strumień nie był buforowany jako res.bodypierwszy.
ortonomy

1
W wersji Express 4.16+ mają wbudowaną własną wersję parsera body, więc nie musisz pobierać tego pakietu.
StefanBob

Odpowiedzi:


255

Aby obsłużyć HTTP POSTżądanie w Express.js w wersji 4 i wyższej, musisz zainstalować moduł oprogramowania pośredniego o nazwie body-parser.

body-parserwyodrębnij całą część treści przychodzącego strumienia żądań i udostępniaj ją req.body.

Oprogramowanie pośrednie było wcześniej częścią Express.js, ale teraz musisz zainstalować je osobno.

Ten body-parsermoduł analizuje JSON, bufor, a URL zakodowany ciąg danych przedstawionych za pomocą HTTP POSTżądania. Zainstaluj body-parserza pomocą NPM, jak pokazano poniżej.

npm install body-parser --save

edytuj w 2019-kwiecień-2: w express@4.16.0 oprogramowanie pośredniczące body-parser w pakiecie z express. po więcej szczegółów zobacz to


126
Jest to prawdopodobnie najlżejsza rzecz na świecie. Dlaczego deweloperzy Express Express mieliby niezwykle utrudniać nowicjuszom wejście na pokład, zmuszając ich do instalowania dodatkowego oprogramowania pośredniego do najczęstszych przypadków użycia w tworzeniu stron internetowych?
elmt

5
@elmt, jeśli chcesz czegoś z opiniami, spróbuj sails.js
George

1
@ user1063287 tak to robi. urlencoded()i json()faktycznie są to fabryki oprogramowania pośredniego, które zwracają funkcję oprogramowania pośredniego, która się wywołujenext()
Nick Manning

3
To nie jest lame @elmt, węzeł jest nie tylko do Internetu, można go używać na komputerze, telefonie komórkowym itp., W takich przypadkach nie jest to wymagany moduł. Węzeł może dostosować się do twojej aplikacji bez żadnej odpowiedzialności
fnaquira

28
@fnaquira - Jesteś zdezorientowany. Chodzi o ekspres, a nie węzeł.
elmt

85

Tak, możemy pracować bez body-parser. Gdy nie używasz tego, dostajesz surowe żądanie, a twoje ciało i nagłówki nie znajdują się w głównym obiekcie parametru żądania. Będziesz musiał indywidualnie manipulować wszystkimi polami.

Lub możesz użyć body-parser, ponieważ zespół ekspresowy go utrzymuje.

Co parser body może dla Ciebie zrobić: Upraszcza to żądanie.
Jak tego użyć: Oto przykład:

zainstalować npm install body-parser --save

Oto jak używać ekspresowego body-parsera:

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

Połączyć.

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

A potem możesz uzyskać treść i nagłówki w obiekcie żądania root. Przykład

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

3
Hej dzięki za informację, czy możesz opublikować przykładowy kod bez parsera treści?
Ilyas karim

55

Odpowiedź tutaj wyjaśnia ją bardzo szczegółowo i doskonale, odpowiedź zawiera:

W skrócie; body-parser wyodrębnia całą część ciała przychodzącego strumienia żądań i udostępnia go req.bodyjako coś łatwiejszego do połączenia. Nie potrzebujesz tego per se, ponieważ możesz zrobić to wszystko sam. Jednak najprawdopodobniej zrobi to, co chcesz i zaoszczędzi ci kłopotów.


Iść trochę głębiej; body-parser daje ci oprogramowanie pośrednie, które używa nodejs / zlib do rozpakowania danych przychodzących żądań, jeśli są spakowane, i stream-utils / raw-body do oczekiwania na pełną, surową zawartość treści żądania przed „parsowaniem” (to znaczy, że jeśli nie zamierzałeś korzystać z treści żądania, po prostu zmarnowałeś trochę czasu).

Po uzyskaniu surowej zawartości body-parser przeanalizuje ją przy użyciu jednej z czterech strategii, w zależności od konkretnego oprogramowania pośredniego, które zdecydowałeś się użyć:

  • bodyParser.raw () : W rzeczywistości nie analizuje treści, ale po prostu odsłania buforowaną zawartość wcześniej w buforze na req.body.

  • bodyParser.text () : Odczytuje bufor jako zwykły tekst i wyświetla wynikowy ciąg na req.body.

  • bodyParser.urlencoded () : Analizuje tekst jako dane zakodowane w adresie URL (w taki sposób przeglądarki wysyłają dane formularza ze zwykłych formularzy ustawionych na POST) i udostępnia obiekt wynikowy (zawierający klucze i wartości) req.body. Dla porownania; w PHP wszystko to jest wykonywane automatycznie i ujawniane w $_POST.

  • bodyParser.json () : Analizuje tekst jako JSON i udostępnia obiekt wynikowy req.body.

Dopiero po ustawieniu req.bodyżądanej zawartości wywoła następne oprogramowanie pośrednie na stosie, które może następnie uzyskać dostęp do danych żądania bez konieczności zastanawiania się, jak je rozpakować i przeanalizować.

Możesz zapoznać się z githubem parsera ciała, aby przeczytać ich dokumentację, która zawiera informacje dotyczące jego działania.


47

Spróbujmy zachować to najmniej techniczne.

Załóżmy, że wysyłasz dane formularza HTML na serwer node-js, tzn. Wysłałeś żądanie do serwera. Plik serwera otrzyma twoje żądanie w ramach obiektu żądania. Teraz logicznie, jeśli konsolujesz logować ten obiekt żądania w pliku serwera, powinieneś zobaczyć gdzieś w nim dane formularza, które można by wtedy wyodrębnić, ale zaraz! tak naprawdę nie!

Gdzie są nasze dane? Jak go wyodrębnimy, jeśli będzie nie tylko obecny w mojej prośbie.

Prostym wyjaśnieniem tego jest to, że http wysyła dane formularza w kawałkach, które mają zostać zebrane, gdy dotrą do miejsca docelowego. Jak wyodrębnić swoje dane.

Ale po co męczyć się za każdym razem ręcznie analizować dane pod kątem fragmentów i składać je. Użyj czegoś zwanego „parserem ciała”, który zrobiłby to za Ciebie.

body-parser analizuje twoje zapytanie i konwertuje je na format, z którego możesz łatwo wyodrębnić odpowiednie informacje, których możesz potrzebować.

Załóżmy na przykład, że masz interfejs rejestracji w interfejsie użytkownika. Wypełniasz go i prosisz serwer o zapisanie gdzieś szczegółów.

Wyodrębnienie nazwy użytkownika i hasła z żądania jest tak proste, jak poniżej, jeśli używasz parsera ciała.

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

Zasadniczo więc parser treści przeanalizował przychodzące żądanie, zgromadził porcje zawierające dane formularza, a następnie utworzył dla Ciebie ten obiekt treści i wypełnił go danymi formularza.


10

Analizuje treść żądania HTTP. Jest to zwykle konieczne, gdy potrzebujesz wiedzieć więcej niż tylko adres URL, który trafiłeś, szczególnie w kontekście żądania HTTP POST lub PUT PATCH HTTP, w którym żądane informacje znajdują się w treści.

Zasadniczo jest to oprogramowanie pośrednie do analizowania JSON, zwykłego tekstu lub po prostu zwracania surowego obiektu Buffer, abyś mógł sobie z nim poradzić zgodnie z wymaganiami.


8

Aby uzyskać dostęp do danych postu, musimy skorzystać body-parser. Zasadniczo to, body-parserco pozwala ekspresowi odczytać ciało, a następnie przeanalizować je w Jsonobiekcie, który możemy zrozumieć.


7

Wszystko to jest kwestią wygody.

Zasadniczo, jeśli pytanie było: "Czy my potrzebujemy użyć body-parser? Odpowiedź brzmi nie'. Możemy wymyślić te same informacje z żądania klienta po użyciu bardziej okrężnej trasy, która ogólnie będzie mniej elastyczna i zwiększy ilość kodu, który musimy napisać, aby uzyskać te same informacje.

To niby takie same, jak pyta: "Czy my potrzebujemy użyć expresszacząć? Znów odpowiedź brzmi „nie” i znowu, naprawdę wszystko sprowadza się do zaoszczędzenia nam kłopotu z pisaniem większej ilości kodu do robienia podstawowych rzeczy, które ekspresowe ma „wbudowane”.

Na powierzchni - body-parserułatwia dostęp do informacji zawartych w żądaniach klientów w różnych formatach zamiast przechwytywania surowych strumieni danych i ustalania, w jakim formacie są informacje, a tym bardziej ręcznego analizowania tych informacji w użyteczne dane.


6

Zrozumienie treści wniosku

Po otrzymaniu żądania POST lub PUT treść żądania może być ważna dla aplikacji. Uzyskiwanie danych ciała jest nieco bardziej zaangażowane niż dostęp do nagłówków żądań. Obiekt żądania przekazany do modułu obsługi implementuje interfejs ReadableStream. Strumień ten można odsłuchiwać lub przesyłać strumieniowo gdzie indziej, jak każdy inny strumień. Możemy pobrać dane bezpośrednio ze strumienia, nasłuchując zdarzeń „danych” i „zakończeń” strumienia.

Fragment emitowany w każdym zdarzeniu „data” jest buforem. Jeśli wiesz, że będą to ciągi danych, najlepiej jest zebrać dane w tablicy, a następnie na końcu połączyć je i stritować.

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

Zrozumienie parsera ciała

Zgodnie z jego dokumentacją

Analizuj treści przychodzących żądań w oprogramowaniu pośrednim przed programami obsługi, dostępnymi w ramach właściwości req.body.

Jak widzieliśmy w pierwszym przykładzie, musieliśmy ręcznie przeanalizować strumień przychodzących żądań, aby wyodrębnić treść. To staje się trochę nudne, gdy istnieje wiele danych formularzy różnych typów. Używamy więc pakietu body-parser, który wykonuje to wszystko pod maską.

Zapewnia cztery moduły do ​​analizowania różnych typów danych

Po przetworzeniu surowej treści body-parser użyje jednej z powyższych strategii (w zależności od oprogramowania pośredniego, które zdecydowałeś się zastosować) do parsowania danych. Możesz przeczytać o nich więcej, czytając ich dokumentację.

Po ustawieniu req.bodyparsowanego ciała, parser ciała wywoła wywołanie next()następnego oprogramowania pośredniego w dół stosu, który może następnie uzyskać dostęp do danych żądania bez konieczności zastanawiania się, jak go rozpakować i przeanalizować.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.