javascript - Hur får man åtkomst till request body när man POSTar med Node.js och Express?


Jag har följande Node.js-kod:

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

Nu om jag POSTAR något som:

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

Jag får Someone som förväntat. Nu, vad händer om jag vill få hela request-body? Jag försökte göra response.write(request.body) men Node.js kastar ett undantag som säger "first argument must be a string or Buffer" och går sedan in i en "ändlös loop" med ett undantag som säger "Can't set headers after they are sent."; detta gäller även om jag gjorde var reqBody=request.body; och sedan skrev response.write(reqBody).

Vad är problemet här?

Kan jag också bara få den råa förfrågan utan att använda express.bodyParser()?

Svar #1

Från och med express v4.16 finns det inget behov av att kräva några ytterligare moduler, använd bara den inbyggda JSON-mellanprogramvaran:

app.use(express.json())

Så här:

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

Obs - body-parser, som detta beror på, ingår redan i express.

Glöm inte heller att skicka headern Content-Type: application/json

Svar #2

Express 4.0 och senare:

$ npm install --save body-parser

Och sedan i din node-app:

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

Express 3.0 och tidigare:

Försök att skicka detta i ditt cURL-anrop:

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

och se till att dina data är i JSON-format:

{"user":"someone"}

Du kan också använda console.dir i din node.js-kod för att se datan inuti objektet som i följande exempel:

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

Denna andra fråga kan också vara till hjälp: Hur tar man emot JSON i en express node.js POST-förfrågan?

Om du inte vill använda bodyParser, kolla in den här andra frågan: https://stackoverflow.com/a/9920700/446681

Svar #3

Från och med Express 4 verkar följande kod göra susen. Observera att du behöver installera body-parser med 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
});

Svar #4

Du bör inte använda body-parser eftersom det är föråldrat. Prova detta istället

const express = require('express')
const app = express()

app.use(express.json()) //Notice express.json middleware

Funktionen app.use() används för att montera den angivna middleware-funktionen(-erna) på den angivna sökvägen. Den används mest för att ställa in middleware för din applikation.

Nu för att få åtkomst till kroppen, gör bara följande

app.post('/', (req, res) => {
  console.log(req.body)
})

Svar #5

För 2019 behöver du inte installera body-parser.

Du kan använda:

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

Svar #6

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

Detta kommer att hjälpa dig. Jag antar att du skickar kroppen i JSON.

Svar #7

Detta kan uppnås utan body-parser-beroende också, lyssna på request:data och request:end och returnera svaret i slutet av förfrågan, se kodexemplet nedan. 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();
    });
});

Svar #8

I mitt fall saknade jag att ställa in huvudet:

"Content-Type: application/json"

Relaterade artiklar