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());
Wenn ich jedoch nach req.body.something
in meinen Routen frage, erhalte ich eine Fehlermeldung, die darauf hinweist, dass body is undefined
. Hier ist ein Beispiel für eine Route, die req.body
verwendet:
app.post('/admin', function(req, res){
console.log(req.body.name);
});
Ich habe gelesen, dass dieses Problem durch den Mangel an app.use(express.bodyParser());
verursacht wird, aber wie Sie sehen, nenne ich es vor den Routen.
Irgendeine Ahnung?
Wie schon unter einem Kommentar gepostet, löste ich es mit
app.use(require('connect').bodyParser());
anstatt
app.use(express.bodyParser());
Ich weiß immer noch nicht, warum die einfache express.bodyParser()
nicht funktioniert ...
Sie müssen sicherstellen, dass Sie alle Konfigurationen definieren, BEVOR Sie Routen definieren. In diesem Fall können Sie express.bodyParser()
weiterhin verwenden.
Ein Beispiel ist wie folgt:
var express = require('express'),
app = express(),
port = parseInt(process.env.PORT, 10) || 8080;
app.configure(function(){
app.use(express.bodyParser());
app.use(app.router);
});
app.listen(port);
app.post("/someRoute", function(req, res) {
console.log(req.body);
res.send({ status: 'SUCCESS' });
});
Neueste Versionen von Express (4.x) haben die Middleware vom Core-Framework entbündelt. Wenn Sie einen Body Parser benötigen, müssen Sie ihn separat installieren
npm install body-parser --save
und dann tun Sie dies in Ihrem Code
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
Nein. Sie müssen app.use(express.bodyParser())
vor app.use(app.router)
verwenden. Tatsächlich sollte app.use(app.router)
das letzte sein, was Sie anrufen.
Stellen Sie zunächst sicher, dass Sie das npm-Modul mit dem Namen 'body-parser' installiert haben, indem Sie Folgendes aufrufen:
npm install body-parser --save
Stellen Sie dann sicher, dass Sie die folgenden Zeilen eingegeben haben, bevor Sie die Routen aufrufen
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
Der Inhaltstyp im Anforderungsheader ist sehr wichtig, insbesondere wenn Sie die Daten aus curl oder anderen Tools buchen.
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. Wenn Sie dieses Feld leer lassen, wird Express verwirrt.
// Require body-parser (to receive post data from clients)
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
Express 4 hat einen eingebauten Body-Parser. Es muss kein separater Body-Parser installiert werden. Also unten wird es funktionieren:
export const app = express();
app.use(express.json());
Sieht aus, als wäre der Body-Parser nicht mehr mit Express ausgeliefert. Wir müssen es möglicherweise separat installieren.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))
app.use(function (req, res, next) {
console.log(req.body) // populated!
Weitere Informationen und Beispiele finden Sie auf der Git-Seite https://github.com/expressjs/body-parser .
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" angeben. Andernfalls weiß bodyParser möglicherweise nicht, was Sie mit dem Body Ihrer POST - Anfrage tun sollen.
Wenn Sie curl verwenden, um eine POST - Anforderung auszuführen, die ein JSON-Objekt im Hauptteil enthält, würde dies ungefähr so aussehen:
curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute
Wenn Sie eine andere Methode verwenden, stellen Sie sicher, dass Sie dieses Header-Feld gemäß der jeweils gültigen Konvention setzen.
Für den Fall, dass jemand auf dasselbe Problem stößt, das ich hatte; Ich benutze ein URL-Präfix
http://example.com/api/
was war mit dem router eingerichtet
app.use('/api', router);
und dann hatte ich folgendes
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
Behebung meines Problems: Platzieren der Bodyparser-Konfiguration über app.use('/api', router);
Finale
// setup bodyparser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
app.use('/api', router);
Sie können versuchen, diese Codezeile oben (nach Ihren Anweisungen) hinzuzufügen:
app.use(bodyParser.urlencoded({extended: true}));
Die Gründe, warum es funktioniert, finden Sie in den Dokumenten: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
Verwenden Sie app.use (bodyparser.json ()); vor dem Routing. // . app.use ("/ api", routen);
Das ist mir heute passiert. Keine der oben genannten Lösungen funktioniert für mich. Aber ein bisschen googeln half mir, dieses Problem zu lösen. Ich codiere für Wechat-Server von Drittanbietern.
Etwas komplizierter wird es, wenn Ihre Anwendung node.js Streaming-Daten POST lesen muss, z. B. eine Anforderung von einem REST - Client. In diesem Fall wird die Eigenschaft "readable" der Anforderung auf "true" gesetzt, und die POST - Daten müssen in Blöcken gelesen werden, um den gesamten Inhalt zu sammeln.
Viel Zeit verschwendet:
Abhängig von Content-Type in Ihrer client -Anforderung
der server sollte eine andere der folgenden app.use () haben:
app.use(bodyParser.text({ type: 'text/html' }))
app.use(bodyParser.text({ type: 'text/xml' }))
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
app.use(bodyParser.json({ type: 'application/*+json' }))
Quelle: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Beispiel:
Für mich Auf der Clientseite hatte ich unter dem Header:
Content-Type: "text/xml"
Auf der Serverseite habe ich also verwendet:
app.use(bodyParser.text({type: 'text/xml'}));
Dann funktionierte alles gut.
var bodyParser = require('body-parser');
app.use(bodyParser.json());
Das hat meinen Tag gerettet.
Um arbeiten zu können, müssen Sie app.use (app.router) nach app.use (express.bodyParser ()) so verwenden:
app.use(express.bodyParser())
.use(express.methodOverride())
.use(app.router);
Dieses Problem liegt möglicherweise daran, dass Sie keinen Body-Parser verwendet haben ( link )
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
Sie können den Express-Body-Parser verwenden.
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
In der neuesten Version von Express ist bereits ein Body-Parser integriert. So können Sie verwenden:
const express = require('express);
...
app.use(express.urlencoded({ extended: false }))
.use(express.json());
Dank an @spikeyang für die großartige Antwort (siehe unten). Nachdem ich den vorgeschlagenen Artikel gelesen hatte, der dem Beitrag beigefügt war, entschied ich mich, meine Lösung mitzuteilen.
Wann verwenden?
Für die Lösung mussten Sie den Express-Router verwenden, um ihn zu genießen. So: Wenn Sie versucht haben, die akzeptierte Antwort ohne Erfolg zu verwenden, verwenden Sie einfach die Funktion zum Kopieren und Einfügen:
function bodyParse(req, ready, fail)
{
var length = req.header('Content-Length');
if (!req.readable) return fail('failed to read request');
if (!length) return fail('request must include a valid `Content-Length` header');
if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired
var body = ''; // for large payloads - please use an array buffer (see note below)
req.on('data', function (data)
{
body += data;
});
req.on('end', function ()
{
ready(body);
});
}
und nennen Sie es wie:
bodyParse(req, function success(body)
{
}, function error(message)
{
});
HINWEIS: Verwenden Sie für große Nutzlasten einen Array-Puffer ( more @ MDN ).
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.
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
Wenn Sie eine SOAP - Nachricht posten, müssen Sie den Rohkörper-Parser verwenden:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.raw({ type: 'text/xml' }));
Aufbauend auf @ kevin-xue muss der Inhaltstyp deklariert werden. In meiner Instanz war dies nur bei IE9 der Fall, da XDomainRequest keinen Inhaltstyp festlegt, sodass Bodyparser und Expressjs den Hauptteil der Anforderung ignorierten.
Ich bin damit umgekommen, indem ich den Inhaltstyp explizit gesetzt habe, bevor ich die Anfrage an den Body-Parser weiterleitete.
app.use(function(req, res, next) {
// IE9 doesn't set headers for cross-domain ajax requests
if(typeof(req.headers['content-type']) === 'undefined'){
req.headers['content-type'] = "application/json; charset=UTF-8";
}
next();
})
.use(bodyParser.json());
Für jeden, für den keine der obigen Antworten funktioniert hat, musste ich cors zwischen meinem Frontend und Express aktivieren.
Sie können dies entweder durch:
Herunterladen und Aktivieren einer CORS-Erweiterung für Ihren Browser, z. B .:
für Chrome
oder von
Zeilen hinzufügen
var cors=require('cors');
app.use(cors());
zu Ihrer Express app.js
Seite. (Nach npm install cors
)
Eine andere Möglichkeit, leere request.body zu erhalten, wenn Sie das name-Attribut aus dem Eingabeelement vergessen haben ...
<input type="text" /> /* give back empty request.body -> {}*/
<input type="text" name="username" /> /* give back request.body -> {"username": "your-input"} */
Fügen Sie Ihren app.js
hinzu.
vor dem Anruf den Router
const app = express ();
app.use (express.json ());
Wenn Sie ein externes Werkzeug für die Anforderung verwenden, fügen Sie die Kopfzeile hinzu:
Content-Type: application/json
Ich habe es gelöst mit:
app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});