it-swarm.com.de

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

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 POST so etwas wie:

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

Ich erhalte Someone wie erwartet. Was ist nun, wenn ich den vollständigen Anfragetext erhalten möchte? Ich habe versucht, response.write(request.body) zu machen, aber Node.js löst eine Ausnahme aus, die besagt, dass "erstes Argument muss ein String oder ein Puffer sein" und dann zu einer "Endlosschleife" mit der Ausnahme "- Header können nach dem Senden nicht gesetzt werden. "; Dies gilt auch dann, wenn ich var reqBody = request.body; und dann response.write(reqBody) geschrieben habe.

Was ist das Problem hier?

Kann ich die unformatierte Anfrage auch nur abrufen, ohne express.bodyParser() zu verwenden?

137
TheBlueSky

Express 4.0 und höher:

$ npm install --save body-parser

Und dann in deiner Node-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 ebenfalls hilfreich sein: Wie erhalte ich JSON in express node.js POST request?

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

128
Hector Correa

Ab Express v4.16 sind keine zusätzlichen Module mehr 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 enthalten mit express.

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

99
rustyx

Ab Express 4 scheint der folgende Code das Problem zu lösen. Beachten Sie, dass Sie body-parser Mit npm installieren müssen.

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
});
40
Walter Roman
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 senden Körper in Json.

24
Gautam

Dies kann erreicht werden ohne body-parser Abhängigkeit auch zu hören request:data und request:end und geben Sie die Antwort am Ende der Anforderung zurück (siehe unten stehendes 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();
    });
});
6
Manivannan

Versuche dies:

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

Dadurch wird das Objekt, das bodyParser für Sie erstellt hat, wieder in eine Zeichenfolge umgewandelt und in die Antwort geschrieben. Wenn Sie den genauen Anfragetext (mit dem gleichen Leerzeichen usw.) benötigen, müssen Sie data und end Listener an die Anfrage angehängt haben und die Zeichenfolge Block für Block aufbauen, wie Sie sehen können im json parsing source code von connect .

3
Peter Lyons

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 unformatierte Anforderung abrufen möchten, setzen Sie die Handler für die Ereignisse request und data auf end (und entfernen Sie natürlich alle Aufrufe von express.bodyParser(). ). Beachten Sie, dass die Ereignisse data in Blöcken auftreten und dass diese Blöcke, sofern Sie keine Kodierung für das Ereignis data festlegen, Puffer und keine Zeichenfolgen sind.

1
ebohlman

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

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
});
0
Shivam Gupta

Wenn Sie faul genug sind, um einige Post-Daten zu lesen. Sie können einfach unter den Zeilen einfügen, um json zu lesen.

Nachfolgend finden Sie Informationen zu TypeScript. Ähnliches gilt auch für JS.

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 }));

Verwenden Sie in einem beliebigen Controller, der POST Call empfängt, wie unten gezeigt

serController.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 Sie JSON-Daten in Ihrem TS-Modell analysieren.

0
Shujaath Khan