Mam to jako konfigurację mojego serwera Express
app.use(app.router);
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());
Ale wciąż, gdy pytam o to req.body.something
na moich trasach, pojawia się błąd, który to wskazuje body is undefined
. Oto przykład trasy, która wykorzystuje req.body
:
app.post('/admin', function(req, res){
console.log(req.body.name);
});
Czytam, że ten problem jest spowodowany brakiem, app.use(express.bodyParser());
ale jak widać nazywam go przed trasami.
Jakieś wskazówki?
Najnowsze wersje Express (4.x) uwolniły oprogramowanie pośrednie od podstawowej struktury. Jeśli potrzebujesz parsera treści, musisz zainstalować go osobno
a następnie zrób to w swoim kodzie
źródło
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
uratował mnie !!Nie. Musisz użyć
app.use(express.bodyParser())
wcześniejapp.use(app.router)
. W rzeczywistościapp.use(app.router)
powinna to być ostatnia rzecz, do której dzwonisz.źródło
app.use(app.router)
pod.use
rozmowami nie rozwiązuje problemu :(.app.use(require('connect').bodyParser());
zamiastapp.use(express.bodyParser());
.var router=express.Router()
;Najpierw upewnij się, że zainstalowałeś moduł npm o nazwie „body-parser”, wywołując:
Następnie upewnij się, że podałeś następujące linie, zanim zadzwonisz na trasy
źródło
Express 4, ma wbudowany parser treści. Nie trzeba instalować osobnego parsera treści. Więc poniżej będzie działać:
źródło
Nagłówek Content-Type w żądaniu jest naprawdę ważny, szczególnie gdy publikujesz dane z curl lub innych narzędzi.
Upewnij się, że używasz czegoś takiego jak application / x-www-form-urlencoded, application / json lub innych, to zależy od twoich danych postu. Pozostaw to pole puste, pomyli Express.
źródło
Jak już napisano pod jednym komentarzem, rozwiązałem go za pomocą
zamiast
Nadal nie wiem, dlaczego to proste
express.bodyParser()
nie działa ...źródło
connect
moduł przeznpm install connect
i spróbuj ponownie. To jedyna rzecz, o której mogę pomyśleć, czytając wyjście twojego błędu.Content-Type
nagłówka naapplication/json
.Content-Type
nagłówka,application/json
kiedy robiłem moją prośbę.application/json
vstext/json
w żądaniu działa, jak sugeruje @GrantEagon.źródło
Dodaj w swoim
app.js
przed wywołaniem routera
źródło
Wygląda na to, że parser body nie jest już wysyłany ekspresowo. Może być konieczne zainstalowanie go osobno.
Więcej informacji i przykładów można znaleźć na stronie git https://github.com/expressjs/body-parser .
źródło
Na wypadek, gdyby ktoś napotkał ten sam problem, który miałem; Używam przedrostka adresu URL jak
który został skonfigurowany z routerem
a potem miałem następujące
Tym, co naprawiło mój problem, było umieszczenie konfiguracji bodyparsera powyżej
app.use('/api', router);
Finał
źródło
express.bodyParser () musi zostać poinformowany, jaki typ treści jest analizowany. Dlatego musisz upewnić się, że wykonując żądanie POST, dołączasz nagłówek „Content-Type”. W przeciwnym razie bodyParser może nie wiedzieć, co zrobić z treścią żądania POST.
Jeśli używasz curl do wykonania żądania POST zawierającego jakiś obiekt JSON w ciele, wyglądałoby to mniej więcej tak:
Jeśli używasz innej metody, pamiętaj, aby ustawić to pole nagłówka za pomocą odpowiedniej konwencji.
źródło
Użyj app.use (bodyparser.json ()); przed routingiem. //. app.use („/ api”, trasy);
źródło
Możesz spróbować dodać ten wiersz kodu u góry (po żądaniu instrukcji):
Jeśli chodzi o powody, dla których to działa, sprawdź dokumenty: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
źródło
Przez większość czasu wymaganie body jest niezdefiniowane z powodu braku parsera JSON
może brakować parsera ciała
a czasem jest niezdefiniowany ze względu na pochodzenie krzyżowe, więc dodaj je
źródło
To zdarzyło mi się dzisiaj. Żadne z powyższych rozwiązań nie działa dla mnie. Ale trochę googlowania pomogło mi rozwiązać ten problem. Koduję do serwera zewnętrznego firmy Wechat.
Sprawy stają się nieco bardziej skomplikowane, gdy aplikacja node.js wymaga odczytu strumieniowych danych POST, takich jak żądanie klienta REST. W takim przypadku właściwość żądania „czytelny” zostanie ustawiona na wartość true, a dane POST muszą zostać odczytane we fragmentach, aby zebrać całą zawartość.
http://www.primaryobjects.com/CMS/Article144
źródło
Zmarnowałem dużo czasu:
W zależności od Content-Type w Twoim kliencie życzenie serwer powinien mieć różne, jedną z poniżej app.use ():
Źródło: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Przykład:
Dla mnie po stronie klienta miałem poniższy nagłówek:
Po stronie serwera użyłem:
Następnie wymagane jest, aby ktoś działał dobrze.
źródło
w Express 4 jest to naprawdę proste
źródło
Aby pracować, musisz app.use (app.router) po app.use (express.bodyParser ()) w następujący sposób :
źródło
app.use
naapp.router
przedexpress.bodyParser
ale kod wyraźnie wskazuje, że po. Więc co to jest?To uratowało mi dzień.
źródło
Przyczyną tego problemu może być to, że nie użyłeś parsera ciała ( link )
źródło
Rozwiązałem to za pomocą:
źródło
Jest to również jedna możliwość : upewnij się, że powinieneś napisać ten kod przed trasą w pliku app.js (lub index.js).
źródło
Możesz użyć ekspresowego parsera treści.
źródło
Najnowsza wersja Express ma już wbudowany parser treści. Możesz więc użyć:
źródło
W przypadku opublikowania komunikatu SOAP należy użyć analizatora składni treści:
źródło
Opierając się na @ kevin-xue powiedział, typ zawartości musi zostać zadeklarowany. W moim przypadku miało to miejsce tylko w IE9, ponieważ XDomainRequest nie ustawia typu zawartości , więc bodyparser i expressjs ignorowały treść żądania.
Obejrzałem to, ustawiając jawnie typ zawartości przed przekazaniem żądania do parsera treści, w następujący sposób:
źródło
Kredyt dla @spikeyang za wielki odpowiedzi (podane poniżej). Po przeczytaniu sugerowanego artykułu dołączonego do postu postanowiłem podzielić się moim rozwiązaniem.
Kiedy użyć?
Rozwiązanie wymagało użycia routera ekspresowego, aby cieszyć się nim. Więc: Jeśli próbujesz użyć zaakceptowanej odpowiedzi bez powodzenia, po prostu użyj tej funkcji kopiuj i wklej:
i nazwij to tak:
UWAGA: W przypadku dużych ładunków - użyj bufora macierzy ( więcej @ MDN )
źródło
Jeśli używasz jakiegoś zewnętrznego narzędzia do wysłania żądania, pamiętaj o dodaniu nagłówka:
Content-Type: application/json
źródło
Dla każdego, kto nie udzielił żadnej z powyższych odpowiedzi, musiałem włączyć cors między moim front-endem a ekspresowym.
Możesz to zrobić albo:
Pobieranie i włączanie rozszerzenia CORS dla przeglądarki, takie jak:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
dla Chrome
lub przez
Dodawanie linii
do Twojej
app.js
strony ekspresowej . (Ponpm install cors
)źródło