node.js - 用于在请求对象中保存原始发布数据的中间件不会是 "next"并导致超时

标签 node.js post express

我需要获取 Node/快速应用程序中特定端点的原始发布数据。我这样做:

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();
    });
});

发生的事情是我在控制台中获得了 console.log 输出,然后什么也没有发生。大约一分钟后,我看到服务器返回 200 - 可能是超时。这就像 next() 命令永远不会执行,或者执行后失效。

当我注释掉所有内容并简单地调用 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();
});

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

看来我在缓冲 rawBody 的方式上做错了什么?导致 next() 不起作用的原因?

最佳答案

在不等待“结束”的情况下调用 next(),以防止 bodyParser 和您的代码受到干扰。

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

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

  next();
});
app.use(express.bodyParser());

感谢 https://stackoverflow.com/a/21222540/1891397

关于node.js - 用于在请求对象中保存原始发布数据的中间件不会是 "next"并导致超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998980/

相关文章:

node.js - 如何在 Vagrant VM 上安装 bcrypt?

json - fetch() 响应截断大数字

ajax - Node js无法解析字符串化的json

javascript - Cordova 将端口添加到 cordova run 浏览器上的外部链接

javascript - Node.js 将大文件拆分成多个部分并遍历各个部分

html - 未发送 Jquery UI 对话框中的输入?

ios - 使用 Swift 发布 JSON

android - Retrofit2 post 方法显示服务器内部错误但 postman 给出响应

javascript - 使用 Express 在 node.js 中模拟阻塞函数

javascript - Angular 2 和 Express 日期格式 MongoDB