Nagle stało się tak ze wszystkimi moimi projektami.
Ilekroć piszę w nodejs za pomocą express i body-parser, req.body
jest to pusty obiekt.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())
// parse application/json
app.use(bodyParser.json())
app.listen(2000);
app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});
Przez ajax i listonosz jest zawsze pusty.
Jednak poprzez zwijanie
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
działa zgodnie z przeznaczeniem.
Próbowałem ręcznie ustawić Content-type : application/json
w tym pierwszym, ale zawsze otrzymuję400 bad request
Doprowadzało mnie to do szału.
Myślałem, że to coś zaktualizowanego w parserze ciała, ale obniżyłem ocenę i to nie pomogło.
Dziękujemy za pomoc, dziękuję.
Content-Type
listonosza w? Jeśli nie, możesz spróbować, ponieważ miałem wcześniej problemy z tym, że listonosz nie wysyła wiadomościContent-Type
.Odpowiedzi:
W Postman z 3 dostępnych opcji typu zawartości wybierz „X-www-form-urlencoded” i powinno działać.
Aby pozbyć się komunikatu o błędzie, zamień:
Z:
Zobacz https://github.com/expressjs/body-parser
Oprogramowanie pośrednie „body-parser” obsługuje tylko JSON i dane zakodowane w url, nie wieloczęściowe
źródło
app.use(express.json());
Aby przetestować akcje post HTTP za pomocą surowego ładunku danych JSON, wybierz
raw
opcję i ustaw następujące parametry nagłówka:Pamiętaj też, aby zawrzeć wszelkie ciągi używane jako klucze / wartości w ładunku JSON podwójnymi cudzysłowami.
body-parser
Pakiet będzie analizować kilka linii surowy JSON ładunki dobrze.Testowane w Chrome v37 i v41 z rozszerzeniem Postman v0.8.4.13 (
body-parser
v1.12.2 iexpress
v4.12.3) z poniższą konfiguracją:źródło
form-data
z Postmana do publikowania danych, zawsze dostaję to{}
na żądanie. Czy powinienem ustawićContent-Type
opcję?Popełniłem naprawdę głupi błąd i zapomniałem zdefiniować
name
atrybuty danych wejściowych w moim pliku HTML.Więc zamiast
Mam to.
Teraz
request.body
jest wypełnione w następujący sposób:{ password: 'hhiiii' }
źródło
Odkryłem, że działa podczas wysyłania z typem zawartości
w połączeniu z serwerem
app.use(bodyParser.json());
Teraz mogę wysłać przez
a wynik jest dostępny
request.body.name
na serwerze.źródło
xmlHttp.send(JSON.stringify(data));
Zetknąłem się dzisiaj z tym problemem i naprawiłem to, usuwając nagłówek typu zawartości w Postman! Bardzo dziwny. Dodanie go tutaj na wypadek, gdyby komuś pomogło.
Śledziłem samouczek BeerLocker tutaj: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
źródło
Musisz sprawdzić, czy oprogramowanie pośredniczące analizatora ciała jest ustawione poprawnie na typ żądania (json, urlencoded).
Jeśli ustawiłeś,
następnie w listonoszu musisz wysłać dane jako surowe.
https://i.stack.imgur.com/k9IdQ.png zrzut ekranu listonosza
Jeśli ustawiłeś,
następnie należy wybrać opcję „x-www-form-urlencoded”.
źródło
Mój problem polegał na tym, że najpierw tworzyłem trasę
i rejestrowanie oprogramowania pośredniego po trasie
ze względu na strukturę i kopiowanie aplikacji oraz wklejanie projektu razem z przykładów.
Gdy ustaliłem kolejność rejestrowania oprogramowania pośredniego przed trasą, wszystko działało.
źródło
Nawet kiedy uczyłem się node.js po raz pierwszy, kiedy zacząłem uczyć się go za pomocą aplikacji internetowej, wszystko to robiłem dobrze w mojej formie, nadal nie byłem w stanie odbierać wartości w odpowiedzi na żądanie. Po długim debugowaniu dowiedziałem się, że w formie, którą podałem,
enctype="multipart/form-data"
dzięki czemu nie byłem w stanie uzyskać wartości. Po prostu go usunąłem i zadziałało dla mnie.źródło
enctype="multipart/form-data"
multer
- patrz dokumentacja na npmjs.com/package/multerWygląda na to, że nie używasz żadnego encType (domyślnie jest to
application/x-www-form-urlencoded
), dostaniesz pola wprowadzania tekstu, ale nie dostaniesz pliku.Jeśli masz formularz, w którym chcesz zaksięgować wprowadzanie tekstu i plik, użyj
multipart/form-data
typu kodowania, a oprócz tego użyjmulter
oprogramowania pośredniego. Multer przeanalizuje obiekt żądania i przygotujereq.file
dla ciebie, a wszystkie inne pola wejściowe będą dostępne za pośrednictwemreq.body
.źródło
multer
rzeczywiście było rozwiązaniem mojego problemu. Byłoby dobrze, gdybyś mógł dodać przykład, w jaki sposób korzystać z tego w ramach swojej odpowiedziPodobny problem przydarzył mi się, po prostu wymieszałem kolejność parametrów wywołania zwrotnego. Upewnij się, że konfigurujesz funkcje oddzwaniania we właściwej kolejności. Przynajmniej dla każdego, kto ma ten sam problem.
źródło
Upewnij się, że [„klucz”: „typ”, „wartość”: „json”] i [„klucz”: „Typ zawartości”, „wartość”: „application / x-www-form-urlencoded”] nagłówki żądania listonosza
źródło
Rozwiązałem ten problem,
multer
jak wskazano powyżej, ale nie udało im się podać pełnego roboczego przykładu, jak to zrobić. Zasadniczo może się to zdarzyć, gdy masz grupę formularzyenctype="multipart/form-data"
. Oto kod HTML dla formularza, który miałem:A oto jak używać
multer
aby uzyskać wartości i nazwy tego formularza za pomocąExpress.js
inode.js
:źródło
Miałem ten sam problem kilka minut temu, próbowałem wszystkiego, co możliwe w powyższych odpowiedziach, ale żadna z nich nie zadziałała.
Jedyną rzeczą, którą zrobiłem, było uaktualnienie wersji Node JS, nie wiedziałem, że aktualizacja może mieć wpływ na coś, ale tak się stało.
Zainstalowałem wersję Node JS
10.15.0
(najnowsza wersja), do której wróciłem8.11.3
i wszystko działa. Możebody-parser
moduł powinien to naprawić.źródło
Nie miałem nazwy w danych wejściowych ... moja prośba była pusta ... cieszę się, że została zakończona i mogę kontynuować kodowanie. Dziękuję wszystkim!
Odpowiedź, której użyłem Jason Kim:
Więc zamiast
Mam to
źródło
nie powinieneś tego robić
JSON.stringify(data)
podczas wysyłania przez AJAX jak poniżej.To NIE jest poprawny kod:
Prawidłowy kod to:
źródło
Jeśli robisz to z listonoszem, potwierdź te rzeczy, gdy prosisz o API
źródło
Używałem restify zamiast express i napotkałem ten sam problem. Rozwiązaniem było:
źródło
Wierzę, że to może rozwiązać
app.use(express.json());
źródło
Zmień
app.use(bodyParser.urlencoded());
kod naoraz w listonoszu, w nagłówku zmień
Content-Type
wartość zapplication/x-www-form-urlencoded
naapplication/json
Ta :-)
źródło
Dziękujemy wszystkim za wspaniałe odpowiedzi! Spędziłem trochę czasu na poszukiwaniu rozwiązania, a ze swojej strony popełniłem podstawowy błąd: dzwoniłem
bodyParser.json()
z funkcji:Po prostu musiałem to zrobić
app.use(['/password'], bodyParser.json())
i zadziałało ...źródło
W listonoszu, nawet po otrzymaniu zaakceptowanej odpowiedzi, dostawałem puste ciało z prośbą. Problemem okazało się nie przekazywanie nagłówka o nazwie
Ten nagłówek był domyślnie obecny (wraz z 5 innymi), które wyłączyłem. Włącz to, a otrzymasz treść żądania.
źródło
Mój problem polegał na tym, że najpierw utworzyłem trasę.
require("./routes/routes")(app);
Przesunąłem ją na koniec koduapp.listen
i zadziałało!źródło