什么会导致 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 快递问题。因此这个答案。
出于某种原因,我们的 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 快递问题。因此这个答案。