首页 > 解决方案 > 如何解决挂起 /POST 请求与 Express 的正文

问题描述

我希望有人能指出我正确的方向。我正在使用http发送请求来表达并且请求只是挂起,如果我重新启动我的快递服务器,它将返回 500 内部服务器错误,或者以“请求中止”重新启动客户端。奇怪的是,似乎只有当我提交带有正文的 /POST 请求时 - 但是没有正文的 POST 请求可以正常工作。

这是我的要求:

const the_Headers = {
  Authorization: "Bearer <token>",
  "x-custom-header": "custom-header-val",
  "content-type": "application/json",
  "content-length": "21",
}
const data = "{\"test\":\"123\"}"
const result = await new Promise((resolve,reject) => {
  const request = http.request(
    new URL("http://localhost/some/path"), 
    {headers: the_Headers, method: POST}, 
    (res) => {
      res.setEncoding('utf8');
      let responseBody = '';

      res.on('data', (chunk) => {
        responseBody += chunk;
      });

      res.on('end', () => {
        resolve({body: responseBody});
      });
    });
    request.on('error', (err) => {
      reject({statusCode: 500, error: err});
    });

    if (data)
      request.write(data);
    
    request.end();
  })
});

这是我的路由器:

router.post("/some/path",    
    async (req, res) => {
        //  makes it to this breakpoint with empty(no body) POST request
        res.status(200)
            .json({ message: "body is: " + req.body.toString()});
})

这是输出DEBUG=express:*

express:router dispatching POST /some/path +7s
express:router query  : /some/path +1ms
express:router expressInit  : /some/path +0ms
express:router urlencodedParser  : /some/path +0ms
express:router jsonParser  : /some/path +1ms
... (does not proceed from here - so assuming problem with jsonParser)

标签: expresshttp-headershttp-post

解决方案


这是内容长度不匹配。

标头传递的长度为 21 - 当数据为 14 时。这导致 jsonParser 中的读取流从不调用 end() 方法。


推荐阅读