249

我有以下 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()吗?

4

15 回答 15

328

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

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

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

于 2018-04-20T14:19:58.823 回答
197

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

于 2012-07-24T13:14:20.610 回答
44

从 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
});
于 2015-04-24T03:18:40.147 回答
32

对于 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
});
于 2019-08-01T10:09:31.300 回答
25
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 格式发送正文。

于 2017-05-10T10:11:11.043 回答
20

你不应该使用body-parser它已被弃用。试试这个

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

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

app.use()函数用于在指定的路径上挂载指定的中间件函数。它主要用于为您的应用程序设置中间件。

现在要访问正文,只需执行以下操作

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

于 2021-03-26T15:45:34.333 回答
10

这也可以在没有body-parser依赖关系的情况下实现,在请求结束时收听request:datarequest:end返回响应,请参阅下面的代码示例。参考: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();
    });
});
于 2018-07-10T16:24:06.840 回答
6

就我而言,我错过了设置标题

"Content-Type: application/json"

于 2020-08-31T18:37:02.530 回答
4

尝试这个:

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

这将获取bodyParser为您创建的对象并将其转换回字符串并将其写入响应。如果您想要确切的请求正文(具有相同的空格等),您将需要之前附加到请求的侦听器dataend逐块构建字符串,如您在来自 connect 的 json 解析源代码中所见。

于 2012-07-24T13:15:25.947 回答
2

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

下面是 TypeScript 的类似内容,也可以用于 JS。

应用程序.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 }));

在您接收 POST 调用的任何控制器之一中,如下所示

用户控制器.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 应该将您的 json 数据解析为您的 TS 模型。

于 2019-02-27T08:13:08.530 回答
2

我对 JS 和 ES 完全陌生,但似乎对我有用的是:

JSON.stringify(req.body)

让我知道它是否有任何问题!

于 2019-12-18T11:32:58.847 回答
1

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

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

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

于 2012-07-24T10:53:57.120 回答
1

通过以下命令安装 Body Parser

$ npm install --save body-parser

配置正文解析器

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));
于 2020-05-10T03:24:10.410 回答
1

接受的答案仅适用于与 JSON 格式兼容的正文。通常,可以使用以下方式访问主体

app.use(
  Express.raw({
    inflate: true,
    limit: '50mb',
    type: () => true, // this matches all content types
  })
);

喜欢张贴在这里。具有类型并且可以转换为所需的格式req.bodyBuffer

例如通过以下方式转换为字符串:

let body = req.body.toString()

或通过以下方式进入 JSON:

let body = req.body.toJSON();
于 2021-10-18T10:58:45.453 回答
-3

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

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});
于 2016-09-09T04:32:20.000 回答