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

IT技术 javascript node.js express
2021-02-06 05:56:22

我有以下 Node.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

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

这里有什么问题?

另外,我可以只获取原始请求而不使用express.bodyParser()吗?

6个回答

express v4.16开始不需要任何额外的module,只需使用内置的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
})

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

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

我能找到的最好/唯一的解决方案不需要正文解析器
2021-03-21 05:56:22
谢谢,这是 4.16+ 的最佳答案。没有其他依赖项,就像一个魅力!
2021-04-09 05:56:22

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

此外,您可以在 node.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);

另一个问题也可能有帮助:How to receive JSON in express node.js POST request?

如果您不想使用 bodyParser,请查看其他问题:https ://stackoverflow.com/a/9920700/446681

从 express 4.16.0 或更高版本开始,可以通过这种方式在 app.use() 中使用 express.json() => app.use(express.json());
2021-03-23 05:56:22
由于链接stackoverflow.com/a/9920700/446681,我将此标记为答案
2021-03-27 05:56:22
我尝试使用,curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000但它给了我错误“意外的令牌 u ”,这就是为什么我切换到原始帖子中提到的调用。
2021-04-10 05:56:22
express.bodyParser()在 Express 4.x 中已弃用。请改用npmjs.org/package/body-parser
2021-04-10 05:56:22
@TheBlueSky 你得到“Unexpected token u”的原因是因为 shell 消耗了你的双引号。如果你这样做,同样的事情会发生echo any"thing"您发布的数据应在引号内,以防止发生这种情况。
2021-04-11 05:56:22

从 Express 4 开始,以下代码似乎可以解决问题。请注意,您需要body-parser使用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
});
要解析 json 正文,需要添加以下行 app.use(bodyParser.json())
2021-03-21 05:56:22
@ cml.co是没有任何理由app.use(bodyParser.urlencoded({ extended: true })需要?我在请求中以 JSON 格式发布了一个相当复杂的文档,extended: false但没有奏效。只有当我将其设置为 true 时,才会正确解析请求。
2021-04-01 05:56:22
只是一个注释。必须使用app.use(bodyParser.urlencoded({ extended: true }));ANDapp.use(bodyParser.json())在带有 NodeJS 和 Express 的 AWS Linux 服务器设置上获取 json 数据。
2021-04-02 05:56:22

对于 2019 年,您无需安装body-parser.

您可以使用:

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

这会帮助你。我假设你在 json 中发送 body。

我总是忘记添加 bodyParser.json() 位 x_x 谢谢!
2021-03-22 05:56:22