Jeśli korzystasz z Express (wysokowydajne, wysokiej klasy projektowanie stron internetowych dla Node.js), możesz to zrobić:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
Klient API:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "[email protected]"
}
})
});
Node.js: (od Express v4.16.0)
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
Node.js: (dla Express <4.16.0)
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
app.post("/", function (req, res) {
console.log(req.body.user.name)
});
app.use(express.bodyParser());
.Możesz użyć
querystring
modułu:Teraz, na przykład, jeśli masz
input
pole o nazwieage
, możesz uzyskać do niego dostęp za pomocą zmiennejpost
:źródło
var POST = qs.parse(body); // use POST
tylko dla noobów takich jak ja: gdy nazwa wejściowego pola tekstowego to „użytkownik”,Post.user
pokaże dane tego pola. np.console.log(Post.user);
readable
wywołania zwrotnego zamiast budować dane w ciągu znaków. Po wystrzeleniu ciało jest dostępne przezrequest.read();
req.connection.destroy();
to nie zapobiega wykonaniu wywołań zwrotnych! Na przykład wywołanie zwrotne „on end” zostanie wykonane przy obciętym ciele! Prawdopodobnie nie tego chcesz ...Pamiętaj, aby zabić połączenie, jeśli ktoś spróbuje zalać pamięć RAM!
źródło
var POST = qs.parse(body); // use POST
tylko dla noobów: gdy nazwa wejściowego pola tekstowego to „użytkownik”, Post.user wyświetli dane tego pola. np. console.log (Post.user);Wiele odpowiedzi tutaj nie jest już dobrymi praktykami lub niczego nie wyjaśniam, dlatego to piszę.
Podstawy
Kiedy wywołanie zwrotne http.createServer jest wywoływane, oznacza to, że serwer faktycznie otrzymał wszystkie nagłówki żądania, ale możliwe jest, że dane nie zostały jeszcze odebrane, więc musimy na to poczekać. Obiekt żądania HTTP (instancja http.IncomingMessage) jest w rzeczywistości strumieniem czytelnym . W strumieniach czytelnych za każdym razem, gdy przybywa fragment danych, emitowane jest zdarzenie (zakładając, że zarejestrowałeś wywołanie zwrotne do niego), a po nadejściu wszystkich fragmentów wydarzenie jest emitowane. Oto przykład, w jaki sposób słuchasz wydarzeń:
data
end
Konwersja buforów na ciągi
Jeśli spróbujesz tego, zauważysz, że fragmenty są buforami . Jeśli nie masz do czynienia z danymi binarnymi i zamiast tego potrzebujesz pracy z ciągami, sugeruję użycie metody request.setEncoding , która powoduje, że strumień emituje ciągi interpretowane z danym kodowaniem i poprawnie obsługuje znaki wielobajtowe.
Buforowanie fragmentów
Teraz prawdopodobnie nie interesuje Cię każdy fragment, więc w tym przypadku prawdopodobnie chcesz go buforować w następujący sposób:
Tutaj używany jest Buffer.concat , który po prostu łączy wszystkie bufory i zwraca jeden duży bufor. Możesz także użyć modułu konkat-stream który robi to samo:
Analiza treści
Jeśli próbujesz zaakceptować HTML tworzy przedstawienie POST bez plików lub wręczać jQuery ajax połączeń z domyślnego typu zawartości, a następnie typ zawartości jest
application/x-www-form-urlencoded
zuft-8
kodowaniem. Możesz użyć modułu querystring, aby dokonać serializacji i uzyskać dostęp do właściwości:Jeśli zamiast tego masz typ JSON, możesz po prostu użyć JSON.parse zamiast qs.parse .
Jeśli masz do czynienia z plikami lub obsługujesz wieloczęściowy typ zawartości, to w takim przypadku powinieneś użyć czegoś takiego jak budzący grozę, który usuwa cały ból związany z radzeniem sobie z tym. Spójrz na moją inną odpowiedź, w której zamieściłem pomocne linki i moduły do treści wieloczęściowych.
Rurociąg
Jeśli nie chcesz analizować zawartości, ale przesłać ją w inne miejsce, na przykład wyślij ją do innego żądania http jako dane lub zapisz w pliku, sugeruję potokowanie raczej przesłanie zamiast buforowania, ponieważ będzie mniej kod, lepiej radzi sobie z przeciwciśnieniem, zajmie mniej pamięci, a w niektórych przypadkach szybciej.
Więc jeśli chcesz zapisać zawartość do pliku:
Ograniczanie ilości danych
Jak zauważyły inne odpowiedzi, pamiętaj, że złośliwi klienci mogą wysyłać ci ogromną ilość danych, aby spowodować awarię aplikacji lub zapełnić pamięć, aby zabezpieczyć się przed odrzuceniem żądań, które emitują dane, przekraczają pewien limit. Jeśli nie używasz biblioteki do obsługi przychodzących danych. Sugerowałbym użycie czegoś w rodzaju miernika strumienia, który może przerwać żądanie, jeśli osiągnie określony limit:
lub
lub
Moduły NPM
Chociaż opisałem powyżej, w jaki sposób można używać treści żądania HTTP, do zwykłego buforowania i analizowania zawartości, sugeruję użycie jednego z tych modułów, który jest implementowany samodzielnie, ponieważ prawdopodobnie będą lepiej obsługiwać przypadki brzegowe. W przypadku ekspresu sugeruję użycie parsera ciała . W przypadku koa istnieje podobny moduł .
Jeśli nie używasz frameworka, body jest całkiem dobre.
źródło
request
jest ponownie wykorzystywana irequest.on('end')
wywoływana wielokrotnie? Jak mogę tego uniknąć?request.on('end', ...)
będą wywoływane.Oto bardzo proste opakowanie bez frameworka oparte na innych odpowiedziach i artykułach zamieszczonych tutaj:
Przykład użycia:
źródło
response.post
bardziej logicznerequest.post
. Zaktualizowałem post.Będzie czystsze, jeśli zakodujesz swoje dane w JSON , a następnie wyślesz je do Node.js.
źródło
qs.parse()
,JSON.parse()
okazało się, że ciało w coś użyteczny. Przykład:,var post = JSON.parse(body);
a następnie uzyskaj dostęp do danych za pomocąpost.fieldname
. (Morał z tej historii, jeśli jesteś zdezorientowany co do tego, co widzisz, nie zapomnij otypeof
!)request.setEncoding
aby to działało poprawnie, w przeciwnym razie może nie obsługiwać poprawnie znaków innych niż ascii.Dla każdego, kto zastanawia się, jak wykonać to trywialne zadanie bez instalowania frameworka internetowego, udało mi się to połączyć. Produkcja prawie nie jest gotowa, ale wydaje się, że działa.
źródło
Możesz użyć
body-parser
oprogramowania pośredniczącego do analizowania treści Node.js.Pierwsze ładowanie
body-parser
Niektóre przykładowy kod
Więcej dokumentacji można znaleźć tutaj
źródło
Odniesienie: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
źródło
Oto, jak możesz to zrobić, jeśli używasz węzła-formidable :
źródło
Jeśli wolisz używać czystego pliku Node.js, możesz wyodrębnić dane POST, tak jak pokazano poniżej:
źródło
1) Zainstaluj
'body-parser'
z npm.2) Następnie w pliku app.ts
3) następnie musisz napisać
w module app.ts
4) pamiętaj, że to Ty
na górze lub przed jakąkolwiek deklaracją modułu.
Dawny:
5) Następnie użyj
źródło
Jeśli nie chcesz porcji danych razem z
data
oddzwanianiem, zawsze możesz użyćreadable
oddzwaniania w następujący sposób:Takie podejście modyfikuje przychodzące żądanie, ale zaraz po zakończeniu odpowiedzi zostanie ono wyrzucone, więc nie powinno to stanowić problemu.
Zaawansowanym podejściem byłoby sprawdzenie najpierw wielkości ciała, jeśli boisz się dużych ciał.
źródło
request
jest normalnym strumieniem node.js, więc możesz sprawdzićrequest.headers
długość ciała i przerwać żądanie, jeśli to konieczne.Można to zrobić na wiele sposobów. Jednak najszybszym sposobem, jaki znam, jest użycie biblioteki Express.js z body-parserem.
Może to działać w przypadku ciągów, ale zamiast tego zmienię bodyParser.urlencoded na bodyParser.json, jeśli dane POST zawierają tablicę JSON.
Więcej informacji: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
źródło
Musisz odbierać
POST
dane w porcjach za pomocąrequest.on('data', function(chunk) {...})
Należy rozważyć dodanie limitu rozmiaru we wskazanej pozycji, zgodnie z sugestią jh .
źródło
setTimeout
, gdy połączenie zakończy połączenie po pewnym czasie, jeśli pełne żądanie nie zostanie odebrane w tym oknie.Express v4.17.0
źródło
Jeśli używasz Express.js , zanim będziesz mógł uzyskać dostęp do req.body, musisz dodać oprogramowanie pośrednie bodyParser:
Następnie możesz poprosić o
źródło
A jeśli nie chcesz korzystać z całego frameworka, takiego jak Express, ale potrzebujesz także różnego rodzaju formularzy, w tym przesyłania, formala może być dobrym wyborem.
Jest wymieniony w modułach Node.js
źródło
Znalazłem film, który wyjaśnia, jak to osiągnąć: https://www.youtube.com/watch?v=nuw48-u3Yrg
Wykorzystuje domyślny moduł „http” wraz z modułami „querystring” i „stringbuilder”. Aplikacja pobiera dwie liczby (używając dwóch pól tekstowych) ze strony internetowej i po przesłaniu zwraca sumę tych dwóch (wraz z utrwaleniem wartości w polach tekstowych). To najlepszy przykład, jaki mogłem znaleźć gdziekolwiek indziej.
Powiązany kod źródłowy:
źródło
Dla tych, którzy używają surowego binarnego przesyłania POST bez narzutu kodowania, możesz użyć:
klient:
serwer:
źródło
Możesz użyć ekspresowego oprogramowania pośredniego, które ma teraz wbudowany parser treści. Oznacza to, że wszystko, co musisz zrobić, to:
Ten przykład kodu to ES6 z Express 4.16.x
źródło
możesz wyodrębnić parametr post bez użycia express.
1:
nmp install multiparty
2: import wielopartyjny. tak jak
var multiparty = require('multiparty');
3: `
4: i FORMULARZ HTML JEST.
Mam nadzieję, że to zadziała dla ciebie. Dzięki.
źródło
Ogranicz rozmiar POST, aby uniknąć zalania aplikacji węzła. Istnieje świetny moduł typu raw-body , odpowiedni zarówno do ekspresowego, jak i łączenia, który może pomóc ograniczyć żądanie według rozmiaru i długości.
źródło
Jeśli wiąże się to z przesłaniem pliku, przeglądarka zwykle wysyła go jako
"multipart/form-data"
typ zawartości. Możesz użyć tego w takich przypadkachOdniesienie 1
Odnośnik 2
źródło
Na takich polach formularza
niektóre z powyższych odpowiedzi zakończą się niepowodzeniem, ponieważ obsługują tylko dane płaskie.
Na razie używam odpowiedzi Casey Chu, ale z „qs” zamiast z modułem „querystring”. Jest to również moduł wykorzystywany przez moduł „body-parser” . Więc jeśli chcesz zagnieżdżonych danych, musisz zainstalować qs.
Następnie zastąp pierwszy wiersz, np .:
źródło
Możesz łatwo wysyłać i otrzymywać odpowiedzi na żądanie POST, używając „Żądania - uproszczonego klienta HTTP” i Javascript Promise.
źródło
Musisz użyć bodyParser (), jeśli chcesz, aby dane formularza były dostępne w req.body. body-parser analizuje twoje zapytanie i konwertuje je do formatu, 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.
…………………………………………………….
źródło
JEDEN LINER bez ŚRODKOWEGO OPROGRAMOWANIA
Jeśli publikujesz następujące dane,
'name':'ABC'
możesz je przeanalizować przy użyciu następującego linera ,
źródło