用于在请求对象中保存原始发布数据的中间件不会"下一步"并导致超时

sha*_*sol 4 post node.js express

我需要获取node/express应用程序中特定端点的原始发布数据.我做:

app.use('/paypal/ipn',function(req, res, next) {
    var postData='';

    req.on('data', function(chunk) { 
        postData += chunk;
    });

    req.on('end', function() {
        req.rawBody = postData;
        console.log('ended buffering. result: ' + req.rawBody);
        next();
    });
});
Run Code Online (Sandbox Code Playgroud)

会发生什么是我在控制台中获得console.log输出,然后没有任何反应.大约一分钟后,我看到服务器返回200 - 可能是超时.这就像next()命令永远不会执行,或执行和stales.

当我注释掉所有内容时,只需调用next():

app.use('/paypal/ipn',function(req, res, next) {
    /*
    var postData='';

    req.on('data', function(chunk) { 
        postData += chunk;
    });

    req.on('end', function() {
        req.rawBody = postData;
        console.log('ended buffering. result: ' + req.rawBody);
        next();
    });
    */
    next();
});
Run Code Online (Sandbox Code Playgroud)

一切正常,即调用端点(当然请求不包含rawBody).

所以我似乎在缓冲rawBody的方式做错了什么?导致next()不起作用的东西?

Ore*_*nik 6

调用next()而不等待'end',以防止bodyParser和你的代码干扰.

app.use(function(req, res, next) {
  req.rawBody = '';

  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });

  next();
});
app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

感谢/sf/answers/1485577831/