Wie kann ich beim POSTing mit Node.js und Express auf den Anforderungshauptteil zugreifen?

173

Ich habe den folgenden Node.js-Code:

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

Nun, wenn ich etwas poste wie:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

Ich bekomme Someonewie erwartet. Was ist nun, wenn ich den vollständigen Anfragetext erhalten möchte? Ich habe es versucht, response.write(request.body)aber Node.js löst eine Ausnahme aus, die besagt, dass "das erste Argument eine Zeichenfolge oder ein Puffer sein muss ", und wechselt dann zu einer "Endlosschleife" mit der Ausnahme, dass " Header nach dem Senden nicht festgelegt werden können ". Dies gilt auch, wenn ich es tat var reqBody = request.body;und dann schrieb response.write(reqBody).

Was ist das Problem hier?

Kann ich die Rohanforderung auch nur ohne Verwendung erhalten express.bodyParser()?

Der blaue Himmel
quelle
Es scheint, dass da etwas ist mit response.write(reqBody); Wenn ich response.send(reqBody)Dinge benutze, funktionieren sie gut ... und ja, ich benutze sie response.enddanach response.write.
TheBlueSky

Antworten:

161

Express 4.0 und höher:

$ npm install --save body-parser

Und dann in Ihrer Knoten-App:

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0 und niedriger:

Versuchen Sie dies in Ihrem cURL-Aufruf zu übergeben:

--header "Content-Type: application/json"

und stellen Sie sicher, dass Ihre Daten im JSON-Format vorliegen:

{"user":"someone"}

Sie können auch console.dir in Ihrem node.js-Code verwenden, um die Daten im Objekt wie im folgenden Beispiel anzuzeigen:

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

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

Diese andere Frage könnte auch helfen: Wie empfange ich JSON in der POST-Anfrage von express node.js?

Wenn Sie den bodyParser nicht verwenden möchten, lesen Sie diese andere Frage: https://stackoverflow.com/a/9920700/446681

Hector Correa
quelle
Ich habe versucht curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000, es zu verwenden, aber es gab mir den Fehler " Unerwartetes Token u ". Deshalb habe ich in meinem ursprünglichen Beitrag zu dem genannten Anruf gewechselt.
TheBlueSky
Ich markiere dies als Antwort wegen des Links stackoverflow.com/a/9920700/446681
TheBlueSky
40
express.bodyParser()ist in Express 4.x veraltet. Verwenden Sie stattdessen npmjs.org/package/body-parser .
Luc
@TheBlueSky Der Grund, warum Sie "Unerwartetes Token u" erhalten haben, war, dass die Shell Ihre doppelten Anführungszeichen verbraucht hat. Das gleiche passiert, wenn Sie es tun echo any"thing". Die Daten, die Sie veröffentlichen, sollten in Anführungszeichen stehen, um dies zu verhindern.
Tom Fenech
11
Ab Express 4.16.0 oder höher ist es möglich, express.json () in app.use () auf diese Weise zu verwenden => app.use (express.json ());
Mitro
187

Ab Express v4.16 sind keine zusätzlichen Module erforderlich. Verwenden Sie einfach die integrierte JSON-Middleware :

app.use(express.json())

So was:

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

Hinweis - body-parser, von dem dies abhängt, ist bereits in Express enthalten.

Vergessen Sie auch nicht, den Header zu senden Content-Type: application/json

Rustyx
quelle
14
Vielen Dank, dies ist dann die beste Antwort für 4.16+. Keine anderen Abhängigkeiten und funktioniert wie ein Zauber!
Codepleb
1
Die beste / einzige Lösung, die ich finden konnte, die den Body-Parser nicht benötigt
Mote Zart
41

Ab Express 4 scheint der folgende Code den Trick zu tun. Beachten Sie, dass Sie benötigen zur Installation body-parserverwenden npm.

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));


app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});
Walter Roman
quelle
29
Zum Parsen von JSON-Körpern muss die folgende Zeile hinzugefügt werdenapp.use(bodyParser.json())
Camilo Silva
1
@ cml.co gibt es keinen Grund app.use(bodyParser.urlencoded({ extended: true })ist auch erforderlich? Ich poste ein ziemlich komplexes Dokument als JSON in der Anfrage und extended: falsehabe nicht funktioniert. Erst wenn ich es auf true setze, wird die Anfrage korrekt analysiert.
Web-Benutzer
3
Nur eine Notiz. Musste app.use(bodyParser.urlencoded({ extended: true }));AND verwenden app.use(bodyParser.json()), um JSON-Daten auf einem AWS Linux-Server-Setup mit NodeJS und Express abzurufen.
David
24
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

Das wird dir helfen. Ich nehme an, Sie schicken eine Leiche in json.

Gautam
quelle
Ich vergesse immer das bodyParser.json () Bit x_x hinzuzufügen danke!
Jonny Asmar
14

Für 2019 müssen Sie nicht installieren body-parser.

Sie können verwenden:

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});
Shivam Gupta
quelle
8

Dies kann erreicht werden , ohne body-parserauch die Abhängigkeit, hören request:dataund request:endund gibt die Antwort auf Ende der Anfrage, siehe unten Codebeispiel. Ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

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

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

    // push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});
Manivannan
quelle
3

Versuche dies:

response.write(JSON.stringify(request.body));

Dadurch wird bodyParserdas für Sie erstellte Objekt in einen String umgewandelt und in die Antwort geschrieben. Wenn Sie die genaue Anforderung Körper (mit dem gleichen Leerzeichen, etc.) wollen, müssen Sie dataund endZuhörer auf die Anfrage angebracht vor und die Zeichenfolge Chunk Chunk aufbauen , wie Sie im sehen json Parsing Quellcode von connect .

Peter Lyons
quelle
1

Was Sie behaupten, "versucht zu haben", ist genau das, was Sie in den Code geschrieben haben, der "wie erwartet" funktioniert, wenn Sie ihn mit Curl aufrufen.

Der Fehler, den Sie erhalten, scheint nicht mit dem Code zu zusammenhängen, den Sie uns gezeigt haben.

Wenn Sie die rohe Anfrage erhalten möchten, setzen Sie Handler auf requestder dataund endEreignisse (und natürlich, entfernen Sie alle Beschwörungen express.bodyParser()). Beachten Sie, dass die dataEreignisse in Blöcken auftreten und dass datadiese Blöcke Puffer und keine Zeichenfolgen sind , sofern Sie keine Codierung für das Ereignis festlegen .

ebohlman
quelle
das war ein Fehler beim Kopieren und Einfügen; Ich meinte request.bodyund nicht request.body.user, und ich korrigierte es jetzt. Übrigens var reqBody = request.body;war und ist das richtig und wenn Sie es versuchen, erhalten Sie den Fehler, den ich bekomme. Wie auch immer, können Sie bitte auf ein Beispiel geben über den Handler einstellen request; Ich scheine es nicht im Expressführer zu finden.
TheBlueSky
1

Wenn Sie faul genug sind, Teile von Post-Daten zu lesen. Sie können einfach die folgenden Zeilen einfügen, um json zu lesen.

Unten ist für TypeScript ähnlich, kann auch für JS durchgeführt werden.

app.ts

 import bodyParser from "body-parser";
 // support application/json type post data
 this.app.use(bodyParser.json());
 // support application/x-www-form-urlencoded post data
 this.app.use(bodyParser.urlencoded({ extended: false }));

In einem Ihrer Controller, der einen POST-Anruf empfängt, verwenden Sie ihn wie unten gezeigt

userController.ts

 public async POSTUser(_req: Request, _res: Response) {
   try {
          const onRecord = <UserModel>_req.body;
           /* Your business logic */
           _res.status(201).send("User Created");
        }
    else{
           _res.status(500).send("Server error");
           }        
   };

_req.body sollte Ihre JSON-Daten in Ihr TS-Modell analysieren.

Shujaath Khan
quelle
1
Ich bin nicht sicher, ob Sie versuchen, Leute zu ermutigen oder zu entmutigen, Ihre Antwort zu verwenden, indem Sie sie faul nennen :)
TheBlueSky
1

Ich bin absolut neu in JS und ES, aber was für mich zu funktionieren scheint, ist genau das:

JSON.stringify(req.body)

Lassen Sie mich wissen, wenn etwas nicht stimmt!

balintn
quelle
genau das, was ich brauchte
Josef Henn
0

Installieren Sie Body Parser mit dem folgenden Befehl

$ npm install --save body-parser

Konfigurieren Sie den Body Parser

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));
Arun Abimanyu
quelle
-3

Sie verwenden den folgenden Code, um Postdaten zu protokollieren:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});
Chandra Kumar
quelle
2
Die angegebene Antwort ist unvollständig, ohne das Body-Parser-Modul einzuschließen.
Gramcha