Wie verwende ich die JSON-POST-Daten in einer Express-Anwendung?

307

Ich sende die folgende JSON-Zeichenfolge an meinen Server.

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

Auf dem Server habe ich das.

app.post('/', function(request, response) {

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

Wenn ich die Zeichenfolge sende, wird angezeigt, dass ich eine Antwort von 200 erhalten habe, die beiden anderen Methoden jedoch nie ausgeführt werden. Warum ist das so?

Neuromant
quelle

Antworten:

479

Ich denke, Sie verbinden die Verwendung des responseObjekts mit der des request.

Das responseObjekt dient zum Zurücksenden der HTTP-Antwort an den aufrufenden Client, während Sie auf den Hauptteil des zugreifen möchten request. Siehe diese Antwort, die einige Anleitungen enthält.

Wenn Sie gültiges JSON verwenden und es POSTEN Content-Type: application/json, können Sie die bodyParserMiddleware verwenden, um den Anforderungshauptteil zu analysieren und das Ergebnis request.bodyIhrer Route zu platzieren.

var express = require('express')
  , app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

Test nach dem Vorbild von:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

Aktualisiert für Express 4+

Der Body Parser wurde nach Version 4 in ein eigenes npm-Paket aufgeteilt und erfordert eine separate Installation npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Update für Express 4.16+

Ab Release 4.16.0 ist eine neue express.json()Middleware verfügbar.

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);
Pero P.
quelle
21
request.body.MyKey
Pero P.
5
Weil die Verkettung toString()das Objekt aufruft . Schauen Sie sich die Knotendokumente an console.log, um das Objekt zu untersuchen und eine Zeichenfolgendarstellung zurückzugeben.
Pero P.
13
console.log('request =' + JSON.stringify(request.body))
Pero P.
3
Der Strom console.log()wird automatisch ein Objekt (via util.inspect()) stringifizieren , so dass dies funktionieren würde:console.log("with request", request.body);
Tommy Stanton
4
Diese Antwort ist veraltet, aber die von @chrisarton ist aktuell.
Emil Ingerslev
209

Für Express v4 +

Installieren Sie den Body-Parser von der npm.

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})
Chrisarton
quelle
23
Warum nehmen sie immer wieder Sachen heraus, die jeder benutzt?
Light24bulbs
11
@ light24bulbs Also wird es (Express) schlanker und gemeiner für diejenigen, die das nicht benutzen / brauchen.
andyengle
6
@andyengle Das macht Sinn. Aber ich denke, praktisch jeder verwendet das Analysieren von Anfragen. Das scheint mir ein Kernmerkmal zu sein.
Light24bulbs
23
Da die Middleware-Funktionsoberfläche ein Standard ist, der von vielen Bibliotheken verwendet wird, können auch Apps, die Express nicht verwenden, diese Middleware-Funktionen verwenden.
Anm
3
Wenn Sie es aus dem Express entfernen, kann es nicht von Apps verwendet werden, die keine Anforderungen verwenden. Sie hätten es separat machen und standardmäßig in Express aufnehmen können.
JJ
18

Manchmal benötigen Sie keine Bibliotheken von Drittanbietern, um JSON aus Text zu analysieren. Manchmal brauchen Sie nur den folgenden JS-Befehl: Versuchen Sie es zuerst:

        const res_data = JSON.parse(body);
xims
quelle
3
Die ursprüngliche Frage betrifft das Parsen von JSON aus einer POST-Nachricht im Express-Framework. Ohne die BodyParser-Middleware sind die JSON-Daten nicht in der body-Eigenschaft des Anforderungsobjekts vorhanden.
ThisClark
1
Ich fand dies nützlich, wenn ich die Serverantwort analysierte. Vielen Dank!
Hasan Alsawadi
1
Danke Hasan, ich freue mich über deinen Kommentar. Es hat mir geholfen, als ich nach einer Lösung suchte und auf diesen Beitrag gestoßen bin. Ich bin mir nicht sicher, ob es in allen Fällen funktioniert, aber es funktioniert definitiv in einigen Fällen und es ist eine bessere Lösung als die Verwendung einer Bibliothek eines Drittanbieters.
Xims
1
Ihre Antwort und ein Kommentar liefern der Antwort mehr Informationen (je mehr Informationen Ihre Antwort hier sind). Sie sollten Ihre Antwort aktualisieren, um anzugeben, dass Express den Body-Parser benötigt, oder eine Alternative angeben, um anzugeben, wie der Body-Parser die Daten überhaupt erhalten hat.
Dewwwald
2
definiert nichtbody
Jameshfisher
15

Für diejenigen, die ein leeres Objekt hinein bekommen req.body

Ich hatte vergessen, headers: {"Content-Type": "application/json"} die Anfrage zu stellen. Das Ändern löste das Problem.

Daniel Thompson
quelle
Ich kann nicht glauben, dass ich das verpasst habe! Ich schickte mit text/jsonund bekam {}als Antwort. Totale Kontrolle meinerseits. Sehr hilfreich.
James M. Lay
Ugh - das habe ich auch verpasst. Vielen Dank für die Veröffentlichung, damit ich nicht mehr Zeit verschwenden kann, als ich bereits habe!
Steve Gomez
9

@ Daniel Thompson erwähnt, dass er vergessen hat, {"Content-Type": "application / json"} in die Anfrage aufzunehmen . Er konnte die Anfrage ändern, eine Änderung der Anfragen ist jedoch nicht immer möglich (wir arbeiten hier am Server).

In meinem Fall musste ich erzwingen, dass der Inhaltstyp: text / plain als json analysiert wird.

Wenn Sie den Inhaltstyp der Anforderung nicht ändern können, verwenden Sie den folgenden Code:

app.use(express.json({type: '*/*'}));

Anstatt express.json () global zu verwenden, ziehe ich es vor, es nur bei Bedarf anzuwenden, beispielsweise in einer POST-Anfrage:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});
anneb
quelle
7

const express = require('express');
let app = express();
app.use(express.json());

Mit dieser app.use (express.json) können Sie jetzt das eingehende Post-JSON-Objekt lesen

SuRa
quelle