it-swarm.com.de

Express.js Bedarf Körper undefiniert

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?

199
Masiar

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 ...

31
Masiar

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' });
});
231
Mark Bonano

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())
196
Jay

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.

54
danmactough

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());
36
Ankit kaushik

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.

33
Kevin Xue
// 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())
20
ASHISH RANJAN

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());
12
TechTurtle

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 .

9
Praneesh

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.

9
ab107

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); 
8
Jeff Beagley

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

8

Verwenden Sie app.use (bodyparser.json ()); vor dem Routing. // . app.use ("/ api", routen);

5
user1614168

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. 

http://www.primaryobjects.com/CMS/Article144

5
spikeyang

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.

4
isdot

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);
4
HenioJR

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());
2
Arindam

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 }));
2
Kuldeep Mishra

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());
2
LEMUEL ADANE

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 ).

1
ymz

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());
1
Inamur Rahman

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' }));
1
opewix

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());
1
purpletonic

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:

  1. Herunterladen und Aktivieren einer CORS-Erweiterung für Ihren Browser, z. B .:

    https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=de

    für Chrome

oder von

  1. Zeilen hinzufügen

    var cors=require('cors');
    
    app.use(cors());
    

zu Ihrer Express app.js Seite. (Nach npm install cors)

1
lmb

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"} */
0
lendoo

Fügen Sie Ihren app.js hinzu.
vor dem Anruf den Router

const app = express ();
app.use (express.json ());

0
abdesselam

Wenn Sie ein externes Werkzeug für die Anforderung verwenden, fügen Sie die Kopfzeile hinzu:

Content-Type: application/json

0
Inc33

Ich habe es gelöst mit:

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});
0
Kkkk Kkkk