Ich habe dies als Konfiguration meines Express-Servers
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());
Aber immer noch, wenn ich req.body.something
auf meinen Routen danach frage, erhalte ich einen Fehler, der darauf hinweist body is undefined
. Hier ist ein Beispiel für eine Route, die Folgendes verwendet req.body
:
app.post('/admin', function(req, res){
console.log(req.body.name);
});
Ich habe gelesen, dass dieses Problem durch das Fehlen von verursacht wird, app.use(express.bodyParser());
aber wie Sie sehen können, nenne ich es vor den Routen.
Irgendeine Ahnung?
Die neuesten Versionen von Express (4.x) haben die Middleware vom Kernframework entbündelt. Wenn Sie einen Body Parser benötigen, müssen Sie ihn separat installieren
und dann tun Sie dies in Ihrem Code
quelle
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
rettete mich !!Nein, Sie müssen
app.use(express.bodyParser())
vorher verwendenapp.use(app.router)
. In der Tatapp.use(app.router)
sollte das letzte sein, was Sie anrufen.quelle
app.use(app.router)
.use
app.use(require('connect').bodyParser());
statt gelöstapp.use(express.bodyParser());
.var router=express.Router()
.Stellen Sie zunächst sicher, dass Sie das npm-Modul mit dem Namen 'body-parser' installiert haben, indem Sie Folgendes aufrufen:
Stellen Sie dann sicher, dass Sie die folgenden Zeilen eingefügt haben, bevor Sie Routen aufrufen
quelle
Express 4 verfügt über einen integrierten Body-Parser. Es ist nicht erforderlich, einen separaten Body-Parser zu installieren. Also unten wird funktionieren:
quelle
Der Header "Content-Type in Request" ist sehr wichtig, insbesondere wenn Sie die Daten von Curl oder anderen Tools veröffentlichen.
Stellen Sie sicher, dass Sie etwas wie application / x-www-form-urlencoded, application / json oder andere verwenden. Dies hängt von Ihren Post-Daten ab. Lassen Sie dieses Feld leer, um Express zu verwirren.
quelle
Wie bereits unter einem Kommentar gepostet, habe ich es mit gelöst
anstatt
Ich weiß immer noch nicht, warum das Einfache
express.bodyParser()
nicht funktioniert ...quelle
connect
Modul über zu installierennpm install connect
und es erneut zu versuchen . Dies ist das einzige, woran ich denken kann, wenn ich die Ausgabe Ihres Fehlers lese.Content-Type
Header auf zu setzenapplication/json
.Content-Type
Headers auf,application/json
als ich meine Anfrage erledigte .application/json
vstext/json
in der Anfrage funktioniert, wie von @GrantEagon vorgeschlagen.quelle
Fügen Sie in Ihrem
app.js
vor dem Anruf des Routers
quelle
Der Body-Parser wird anscheinend nicht mehr mit Express ausgeliefert. Möglicherweise müssen wir es separat installieren.
Weitere Informationen und Beispiele finden Sie auf der Git-Seite https://github.com/expressjs/body-parser .
quelle
Für den Fall, dass jemand auf dasselbe Problem stößt, das ich hatte; Ich verwende ein URL-Präfix wie
welches mit Router eingerichtet wurde
und dann hatte ich folgendes
Was mein Problem behoben hat, war das Platzieren der Bodyparser-Konfiguration oben
app.use('/api', router);
Finale
quelle
express.bodyParser () muss mitgeteilt werden, um welche Art von Inhalt es sich handelt. Daher müssen Sie sicherstellen, dass Sie beim Ausführen einer POST-Anforderung den Header "Content-Type" einschließen. Andernfalls weiß bodyParser möglicherweise nicht, was mit dem Text Ihrer POST-Anforderung zu tun ist.
Wenn Sie curl verwenden, um eine POST-Anforderung auszuführen, die ein JSON-Objekt im Hauptteil enthält, sieht dies ungefähr so aus:
Wenn Sie eine andere Methode verwenden, stellen Sie sicher, dass Sie dieses Headerfeld mit der entsprechenden Konvention festlegen.
quelle
Verwenden Sie app.use (bodyparser.json ()); vor dem Routing. //. app.use ("/ api", Routen);
quelle
Sie können versuchen, diese Codezeile oben hinzuzufügen (nach Ihren erforderlichen Anweisungen):
Informationen zu den Gründen für die Funktionsweise finden Sie in den Dokumenten: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
quelle
Meistens ist req.body aufgrund des fehlenden JSON-Parsers undefiniert
könnte für den Body-Parser fehlen
und manchmal ist es aufgrund des Cros-Ursprungs undefiniert, also füge sie hinzu
quelle
Das ist mir heute passiert. Keine der oben genannten Lösungen funktioniert für mich. Aber ein bisschen googeln hat mir geholfen, dieses Problem zu lösen. Ich codiere für Wechat-Server von Drittanbietern.
Etwas komplizierter wird es, wenn für Ihre Anwendung node.js Streaming-POST-Daten gelesen werden müssen, z. B. eine Anforderung von einem REST-Client. In diesem Fall wird die Eigenschaft "lesbar" der Anforderung auf "true" gesetzt und die POST-Daten müssen in Blöcken gelesen werden, um den gesamten Inhalt zu erfassen.
http://www.primaryobjects.com/CMS/Article144
quelle
Viel Zeit verschwendet:
Abhängig vom Inhaltstyp in Ihrer Client- Anfrage sollte
der Server eine andere haben, eine der folgenden app.use ():
Quelle: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Beispiel:
Auf der Client-Seite hatte ich unter der Überschrift:
Auf der Serverseite habe ich also Folgendes verwendet:
Dann hat req.body gut funktioniert.
quelle
In Express 4 ist das ganz einfach
quelle
Um zu arbeiten, müssen Sie app.use (app.router) nach app.use (express.bodyParser ()) wie folgt ausführen :
quelle
app.use
aufapp.router
vor ,express.bodyParser
aber Ihr Code zeigt deutlich , Es ist nach. Also was ist es?Das hat mir den Tag gerettet.
quelle
Dieses Problem kann daran liegen, dass Sie keinen Body-Parser verwendet haben ( Link )
quelle
Ich habe es gelöst mit:
quelle
Dies ist auch eine Möglichkeit : Stellen Sie sicher, dass Sie diesen Code vor der Route in Ihre Datei app.js (oder index.js) schreiben.
quelle
Sie können den Express-Body-Parser verwenden.
quelle
In der neuesten Version von Express ist bereits ein Body-Parser integriert. So können Sie verwenden:
quelle
Wenn Sie eine SOAP-Nachricht veröffentlichen, müssen Sie den Raw-Body-Parser verwenden:
quelle
Aufbauend auf @ kevin-xue muss der Inhaltstyp deklariert werden. In meinem Fall trat dies nur bei IE9 auf, da XDomainRequest keinen Inhaltstyp festlegt, sodass bodyparser und expressjs den Hauptteil der Anforderung ignorierten.
Ich habe dies umgangen, indem ich den Inhaltstyp explizit festgelegt habe, bevor ich die Anforderung an den Body-Parser weitergeleitet habe:
quelle
Dank an @spikeyang für die großartige Antwort ( siehe unten). Nachdem ich den vorgeschlagenen Artikel gelesen hatte, der dem Beitrag beigefügt war, beschloss ich, meine Lösung zu teilen.
Wann verwenden?
Für die Lösung mussten Sie den Express-Router verwenden, um ihn genießen zu können. Wenn Sie also versucht haben, die akzeptierte Antwort ohne Erfolg zu verwenden, verwenden Sie einfach diese Funktion zum Kopieren und Einfügen:
und nenne es wie:
HINWEIS: Für große Nutzdaten verwenden Sie bitte einen Array-Puffer ( mehr @ MDN ).
quelle
Wenn Sie ein externes Tool verwenden, um die Anforderung zu stellen, müssen Sie den Header hinzufügen:
Content-Type: application/json
quelle
Für jeden, für den keine der oben genannten Antworten funktioniert hat, musste ich Cors zwischen Front-End und Express aktivieren.
Sie können dies entweder tun durch:
Herunterladen und Aktivieren einer CORS-Erweiterung für Ihren Browser, z.
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=de
für Chrome
oder von
Zeilen hinzufügen
zu Ihrer Express-
app.js
Seite. (Nachhernpm install cors
)quelle