我有以下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();
});

现在如果我POST一些东西:

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

我得到了某人。现在,如果我想要得到完整的请求体呢?我试着做response.write(request.body),但Node.js抛出一个异常,说“第一个参数必须是一个字符串或Buffer”,然后进入一个“无限循环”,异常说“发送后不能设置标头”;这也是真的,即使我做var reqBody = request.body;然后写入response.write(reqBody)。

这里的问题是什么?

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


当前回答

Express 4.0及以上:

$ NPM install——保存body-parser

然后在你的节点应用中

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

Express 3.0及以下:

尝试在cURL调用中传递这个:

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

确保你的数据是JSON格式:

{“用户”:“有人”}

另外,你也可以使用控制台。在node.js代码中使用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

其他回答

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

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

如果希望获得原始请求,请为数据和结束事件设置请求处理程序(当然,还要删除express.bodyParser()的任何调用)。请注意,数据事件将以块的形式发生,除非您为数据事件设置了编码,否则这些块将是缓冲区,而不是字符串。

从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中。

另外,不要忘记发送头部内容类型:application/json

接受的答案只适用于与JSON格式兼容的主体。一般来说,主体可以使用

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

就像贴在这里的。要求的事情。body具有Buffer类型,可以转换为所需的格式。

例如,通过:

let body = req.body.toString()

或通过以下方式转换成JSON:

let body = req.body.toJSON();

您不应该使用体解析器,它已被弃用。试试这个吧

Const express = require('express') Const app = express() app.use(express.json()) //注意express.json。json中间件

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

现在要访问主体,只需执行以下操作

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

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

下面是对于TypeScript,类似的操作也可以用于JS。

app.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调用的任意控制器中使用如下所示

userController.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模型。