什么会导致 node.js express 中的请求正文变空?

What can cause the request body to become empty in node.js express?

出于某种原因,我们的 post 请求中的主体为空。 浏览器正在发送数据,我们可以看到正文存在于我们的 NGINX 服务器中,但是一旦它到达 node.js 服务器似乎丢失了。

我已经使用 'util' 打印出整个请求,它很大,所以我想我会在下面列出 "body-related" 属性

parser:
.....      
onBody: [Function: parserOnBody],
    ....
 _httpMessage:
  ....
    _hasBody: true,

....

body: {},

所有其他数据似乎都在那里,cookie 等... 请求对象还包含所有路由信息。 "parserOnBody" 可能是原因吗?

并非所有路由都会出现,POST 其他路由的请求确实包含主体。

node.js 在容器中是 运行,nginx 服务器在 host-os 上是 运行,会不会有问题请求转发 ?

下面是我们方法的开始

// add answer
app.post('/questions/:id([0-9a-fA-F]{24})/answers'
, passport.authenticate('token', { session: false })
, fetch(models.Question)
, stream()
, function(req, res) {
//console.log('add answer req '+util.inspect(req, false, null));
var question = req.model;

var answer = req.body;
console.log('add answer body '+util.inspect(answer, false, null));

注释行打印了巨大的请求,第二个日志条目打印了 {}。 我知道 console.log 应该避免,但我需要一种方法来传输我的发现...

在检查了 parseBody 中间件后,我发现请求的内容长度是 0。解析器得出结论:no body,这似乎是正确的。

我为 NGINX 服务器添加了调试日志格式

log_format  debug  '[$time_local] "$request" '
                  ' "#$http_transfer_encoding" [$http_content_length] '
                 '"$request_length"  [$request_body_file]';

当我们重放错误场景时,我们看到有两个请求传入,第一个请求的 content_length 为零,这解释了我们的 node.js 服务器中的空主体。第二个没到...

[18/Jun/2015:13:18:31 +0200] "POST /api/questions/558138bdde3afb400400001d/answers HTTP/1.1"  "#-" [0] "890"  [-]
[18/Jun/2015:13:18:31 +0200] "POST /api/questions/558138bdde3afb400400001d/answers HTTP/1.1"  "#-" [1623] "2383"  [-]

第二行对应我们请求成功后的那一行

问题仍然存在,但不再是 node.js 快递问题。因此这个答案。