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

我有以下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抛出一个异常,说“ 第一个参数必须是字符串或Buffer ”,然后转到“无限循环”,并出现异常,指出“ 发送标头后不能设置标头 ”。即使我var reqBody = request.body;再写了也是这样response.write(reqBody)

这里有什么问题?

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

Stafan2020/03/24 17:05:16

我绝对不是JS和ES的新手,但似乎对我有用的就是:

JSON.stringify(req.body)

让我知道它有什么问题!

达蒙西里2020/03/24 17:05:16

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

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});
樱小胖Mandy2020/03/24 17:05:16

如果您足够懒惰以读取大块的发布数据。您可以简单地将以下行粘贴以读取json。

以下是针对TypeScript的代码,也可以对JS进行类似操作。

应用程序

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

小卤蛋2020/03/24 17:05:16

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

您收到的错误似乎与您显示给我们的任何代码都不相关。

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

老丝梅神乐2020/03/24 17:05:16

尝试这个:

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

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