使用Node.js和Express进行POSTING时如何访问请求正文?

2022-08-30 00:21:05

我有以下节点.js代码:

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

现在,如果我发布类似的东西:

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

我如期而至。现在,如果我想获取完整的请求正文,该怎么办?我尝试这样做,但Node.js抛出一个异常,说“第一个参数必须是字符串或缓冲区”,然后进入“无限循环”,异常说“发送后无法设置标头”。即使我这样做了,然后写也是如此。Someoneresponse.write(request.body)var reqBody = request.body;response.write(reqBody)

这是什么问题?

另外,我可以在不使用的情况下获取原始请求吗?express.bodyParser()


答案 1

Express v4.16 开始,无需任何附加模块,只需使用内置的 JSON 中间件

app.use(express.json())

喜欢这个:

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

注意 - ,这取决于,已包含在 express 中。body-parser

另外不要忘记发送标题Content-Type: application/json


答案 2

Express 4.0 及更高版本:

$ npm install --save body-parser

然后在您的节点应用程序中:

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

Express 3.0 及更低版本:

尝试在 cURL 调用中传递以下命令:

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

并确保您的数据采用 JSON 格式:

{"user":"someone"}

此外,还可以在节点.js代码中使用 console.dir 来查看对象内的数据,如以下示例所示:

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

另一个问题也可能有所帮助:如何在express node.js POST请求中接收JSON?

如果你不想使用bodyParser,请查看另一个问题:https://stackoverflow.com/a/9920700/446681