Mam następujący kod Node.js:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
Teraz jeśli OPUBLIKUJĘ coś takiego:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Dostaję się Someone
zgodnie z oczekiwaniami. A co, jeśli chcę uzyskać pełną treść żądania? Próbowałem to zrobić, response.write(request.body)
ale Node.js zgłasza wyjątek mówiąc, że „ pierwszy argument musi być łańcuchem lub buforem ”, a następnie przechodzi do „nieskończonej pętli” z wyjątkiem, który mówi: „ Nie można ustawić nagłówków po ich wysłaniu. ”; to również prawda, nawet gdybym to zrobił, var reqBody = request.body;
a potem pisał response.write(reqBody)
.
O co tu chodzi?
Czy mogę po prostu otrzymać surowe żądanie bez używania express.bodyParser()
?
javascript
node.js
express
Niebieskie niebo
źródło
źródło
response.write(reqBody)
; kiedy używam,response.send(reqBody)
rzeczy działają dobrze ... i tak, używamresponse.end
późniejresponse.write
.Odpowiedzi:
Express 4.0 i nowsze:
$ npm install --save body-parser
A następnie w aplikacji node:
Express 3.0 i starsze:
Spróbuj przekazać to w swoim wywołaniu cURL:
--header "Content-Type: application/json"
i upewniając się, że Twoje dane są w formacie JSON:
{"user":"someone"}
Możesz również użyć console.dir w swoim kodzie node.js, aby zobaczyć dane wewnątrz obiektu, jak w poniższym przykładzie:
Pomocne może być również inne pytanie: Jak odebrać JSON w żądaniu POST Express node.js?
Jeśli nie chcesz korzystać z bodyParser, sprawdź to drugie pytanie: https://stackoverflow.com/a/9920700/446681
źródło
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
ale dawało mi to błąd „ Nieoczekiwany token u ”, dlatego przełączyłem się na wspomniane połączenie w moim oryginalnym poście.express.bodyParser()
jest przestarzałe w Express 4.x. Zamiast tego użyj npmjs.org/package/body-parser .echo any"thing"
. Dane, które publikujesz, powinny znajdować się w cudzysłowie, aby temu zapobiec.Począwszy od wersji Express v4.16 nie ma potrzeby stosowania żadnych dodatkowych modułów, wystarczy skorzystać z wbudowanego oprogramowania pośredniczącego JSON :
Lubię to:
Uwaga -
body-parser
od czego to zależy, jest już zawarte w express.Nie zapomnij również wysłać nagłówka
Content-Type: application/json
źródło
Począwszy od Express 4, następujący kod wydaje się załatwiać sprawę. Pamiętaj, że musisz zainstalować
body-parser
za pomocąnpm
.źródło
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
jest również wymagany? Wysyłam dość złożony dokument w postaci JSON w żądaniu iextended: false
nie zadziałało. Dopiero gdy ustawię wartość true, żądanie jest poprawnie analizowane.app.use(bodyParser.urlencoded({ extended: true }));
AND,app.use(bodyParser.json())
aby uzyskać dane json na serwerze AWS Linux z konfiguracją NodeJS i Express.To ci pomoże. Zakładam, że wysyłasz treść w formacie json.
źródło
W 2019 nie musisz instalować
body-parser
.Możesz użyć:
źródło
Można to osiągnąć bez
body-parser
uzależnienia, jak również, słuchaćrequest:data
irequest:end
i zwróci odpowiedź na koniec wniosek, patrz poniżej próbki kodu. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyźródło
Spróbuj tego:
To zabierze obiekt, który
bodyParser
dla ciebie utworzył, zamieni go z powrotem w łańcuch i zapisze go w odpowiedzi. Jeśli chcesz uzyskać dokładną treść żądania (z tą samą białą spacją itp.), Będziesz potrzebowaćdata
iend
nasłuchiwaczy dołączonych do żądania wcześniej i zbudować fragment ciągu po kawałku, jak widać w json parsującym kod źródłowy z connect .źródło
To, co twierdzisz, że „próbowałeś zrobić”, jest dokładnie tym, co napisałeś w kodzie, który działa „zgodnie z oczekiwaniami”, gdy wywołujesz to za pomocą curl.
Wyświetlany błąd nie wydaje się być powiązany z żadnym z przedstawionych nam kodów.
Jeśli chcesz dostać wniosek surowego ustaw teleskopowe na
request
zadata
iend
wydarzeń (i, oczywiście, usunąć wszelkie wywołania zexpress.bodyParser()
). Zauważ, żedata
zdarzenia będą występować w fragmentach i jeśli nie ustawisz kodowania dladata
zdarzenia, te fragmenty będą buforami, a nie ciągami.źródło
request.body
i nierequest.body.user
, i teraz to poprawiłem. Nawiasem mówiąc,var reqBody = request.body;
był i nadal jest poprawny, a kiedy spróbujesz, pojawi się błąd, który otrzymuję. W każdym razie, czy możesz podać przykład włączania programu obsługirequest
; Wydaje się, że nie znajduję tego w ekspresowym przewodniku.Jeśli jesteś wystarczająco leniwy, aby czytać fragmenty danych postów. możesz po prostu wkleić poniższe wiersze, aby odczytać plik json.
Poniżej jest dla TypeScript, podobnie można zrobić dla JS.
app.ts
W jednym z dowolnego kontrolera, który odbiera wywołanie POST, użyj, jak pokazano poniżej
userController.ts
źródło
Jestem absolutnie nowy w JS i ES, ale wydaje mi się, że działa tak:
Daj mi znać, jeśli coś jest z tym nie tak!
źródło
Zainstaluj analizator treści za pomocą poniższego polecenia
Skonfiguruj analizator treści
źródło
Używasz następującego kodu do logowania danych postów:
źródło