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


当前回答

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

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

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

其他回答

这也可以在没有体解析器依赖的情况下实现,侦听request:data和request:end并在请求结束时返回响应,请参阅下面的代码示例。裁判:https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/请求主体

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

从Express 4开始,下面的代码就可以完成这个任务。 注意,你需要使用npm安装body-parser。

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

在我的情况下,我错过了设置头:

“application / json内容类型:

您使用以下代码来记录post数据:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});

如果你懒得阅读大量的帖子数据。 您可以简单地粘贴下面的行 读取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模型。