使用Node.js和Express进行POST时如何访问请求体?

问题描述 投票:124回答:9

我有以下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()的情况下获得原始请求吗?

javascript node.js express
9个回答
128
投票

Express 4.0 and above:

$ npm install --save body-parser

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

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

Express 3.0 and below:

尝试在你的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


-2
投票

您使用以下代码记录发布数据:

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

99
投票

从express v4.16开始,不需要任何额外的模块,只需使用内置的JSON middleware

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

注意 - qzxswpoi,这取决于,body-parser与快递。

另外不要忘记发送标头already included


40
投票

从Express 4开始,以下代码似乎可以解决问题。请注意,您需要使用Content-Type: application/json安装body-parser

npm

24
投票
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发送尸体。


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); 依赖的情况下实现,听body-parserrequest:data并在请求结束时返回响应,请参考下面的代码示例。 REF:request:end

https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

3
投票

试试这个:

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

这将采用response.write(JSON.stringify(request.body)); 为您创建的对象并将其转换回字符串并将其写入响应。如果你想要确切的请求体(具有相同的空格等),你需要先附加请求的bodyParserdata监听器,然后按照你在end中看到的那样按块建立字符串块。


1
投票

您声称“尝试过”的内容正是您在代码中编写的,当您使用curl调用它时,“按预期”工作。

您收到的错误似乎与您向我们展示的任何代码无关。

如果你想获得原始请求,请在json parsing source code from connect上为requestdata事件设置处理程序(当然,删除任何end的调用)。请注意,express.bodyParser()事件将以块的形式发生,除非您为data事件设置编码,否则这些块将是缓冲区,而不是字符串。


0
投票

如果你懒得阅读大量的帖子数据。你可以简单地粘贴下面的行来读取json。

下面是类似的TypeScript,也可以为JS做。

app.ts

data

在您的任何一个接收POST呼叫使用的控制器中,如下所示

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

_req.body应该将你的json数据解析到你的TS模型中。


0
投票

对于2019年,您不需要安装 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"); } };

您可以使用:

body-parser
© www.soinside.com 2019 - 2024. All rights reserved.