完整的POST正文未送达

时间:2018-04-02 22:32:00

标签: node.js express

我正在使用express与IoT设备进行交互。设备与我编写的Django服务器正确交互,但不能与我现在正在编写的node.js服务器交互。设备似乎写入带有HTTP头的第一个数据包(包括"内容长度")和最终" \ r \ n \ r \ n \ n",然后是第二个包POST主体。 Express正在调用我的帖子处理程序,没有正文。

就像我说的,Django正确地处理了这个问题。我认为正在做的是合法的HTTP / TCP和Express不等待" Content-Length"的全长。标题何时应该。这是Express'的一部分吗?设计?我可以将其关闭以便等待整个文档吗?这是一个错误,我应该在这个设备上使用不同的框架吗?

1 个答案:

答案 0 :(得分:0)

快速框架在http框架中是独一无二的,因为它每个版本都会变小。从核心中删除的部分之一是正文解析,因此它现在处理请求主体作为基本node.js,除非您添加中间件。

在标准的邮政处理程序中,请求对象是一个包含标题的流,允许您在请求完成发送数据之前对请求作出反应。

使用echo处理程序最容易看到:

echo (req, res) {
  req.pipe(res);
}

但是大多数时候你想要整体处理帖子身体

postBody (req, res) {
  let body = '';
  req.on('data', d => body += d.toString()); // it comes in as a buffer
  req.on('error', e => { res.statusCode = 400; res.end('bad post data'); });
  req.on('end', () => /*do something with the body */ res.end(body));
}

这意味着最小的中间件在将主体分配给req.body之后只需调用next。虽然在实践中你应该使用https://github.com/expressjs/body-parser之类的,因为它处理边缘情况等。 。

bodyMiddleware (req, res, next) {
  let body = '';
  req.on('data', d => body += d.toString()); // it comes in as a buffer
  req.on('error', e => { res.statusCode = 400; res.end('bad post data'); });
  req.on('end', () => { req.body = body; next(); });
}