Javascript node js express:请求数据无效?

Javascript node js express:请求数据无效?,javascript,node.js,express,Javascript,Node.js,Express,有人能给我解释一下下列行为的原因吗 我有一个nodejs/express Web服务器,假设其中一个post路由包含以下代码: req.on('data', function() { console.log('data arrived'); }) 此代码按预期工作,并在调用时将“数据到达”消息写入控制台。但是,以下代码: setTimeout(function() { req.on('data', function() { console.log('data arrived'); }) },

有人能给我解释一下下列行为的原因吗

我有一个nodejs/express Web服务器,假设其中一个post路由包含以下代码:

req.on('data', function() { console.log('data arrived'); })
此代码按预期工作,并在调用时将“数据到达”消息写入控制台。但是,以下代码:

setTimeout(function() { req.on('data', function() { console.log('data arrived'); }) }, 1000);
即使在同样的情况下也不会打印任何内容。如果我们在短时间后订阅请求对象流的事件,那么请求对象流会发生什么情况

我之所以需要它,是因为我想把大文件上传到我的服务器上。当post请求到达时,我需要创建一个数据库条目,并将数据导入其中。由于数据块的潜在大小,我无法将其存储在内存中,但我无法从数据库回调或任何回调获取请求对象的数据

你有办法解决这个问题吗? 提前谢谢

更新

以下代码仍然不起作用:

req.pause();
setTimeout(function() {
    req.on('data', function(data) { console.log('data arrived'); })
    req.resume();
}, 1000);
更新2

最终目标是这样做:

req.pause();
doSometingAsync(function(result) {
    req.on('data', function(data) { doSomethingWithData(data, result) });
    req.resume();
});
req.on("data", function (data) {
    req.pause();
    console.log("data arrived");
    setTimeout(function(){req.resume();}, 1000);
});
,但这似乎不起作用

更新3

这将导致一个“已过”的时间,而没有任何其他内容:

req.pause()
setTimeout () ->
    console.log 'elapsed'
    req.on 'error', (error) -> console.log error
    req.on 'data', (data) -> console.log 'in data'
    req.on 'end', () -> console.log 'end'
    req.resume()
, 2000
答复:

您可以触发
req.pause()当数据到达时,像将数据写入文件一样处理数据,当文件写入回调触发时,您可以执行
req.resume()以便接收下一个包

除非使用
req.once
而不是
req.on

这会将带宽限制在物理硬盘速度范围内,使应用程序保持异步,并降低ram使用率

更新1答案:

这是一些伪代码:

req.on("data", function (data) {
    req.pause();
    /* do something with data like the following: */
    some_method(some_value, data, function (success) {
        if (success) {
            req.resume();
        }
    });
});
或者像这样:

req.pause();
doSometingAsync(function(result) {
    req.on('data', function(data) { doSomethingWithData(data, result) });
    req.resume();
});
req.on("data", function (data) {
    req.pause();
    console.log("data arrived");
    setTimeout(function(){req.resume();}, 1000);
});
更新2答案: 您应该使用回调函数

在本例中,
doSomethingWithData()的第三个参数启动
请求恢复()此功能完成后立即执行

此外,您应该像这样调用回调以保持异步:

var doSomethingAsync = function (data, result, cb) {
    /* do something with data and result */
    process.nextTick(function () {
        cb();
    });
};

req.pause();
doSomethingAsync(function (result) {
    req.on('data', function (data) {
        req.pause();
        doSomethingWithData(data, result, function () {
            req.resume();
        });
    });
    req.resume();
});
或者你这样做:

var doSomethingAsync = function (data, result, req) {
    /* do something with data and result */
    process.nextTick(function () {
        req.resume();
    });
};

req.pause();
doSomethingAsync(function (result) {
    req.on('data', function (data) {
        req.pause();
        doSomethingWithData(data, result, req);
    });
    req.resume();
});

当然,doSomethingAsync有一个正确调用的回调方法。回调正确启动。主要问题是req.on回调中的代码从未执行。缺少req.resume()。。我可能会因为监督这件事而自杀。。请尝试我最后的一个代码片段。不幸的是,它仍然不起作用,请检查我最后的示例,它尽可能简化以显示问题。当我回家时,我将在node中尝试。我就是不明白为什么这不管用。。您使用的nodejs版本是什么?0.8.12? 你在什么操作系统上运行这个?linux?窗户?mac?最新的节点版本,非确定性适用于所有提到的操作系统(测试服务器尝试全部)。。。我也认为它应该起作用,但它没有起作用,这就是我问题的目的。然而,我在这里找到了原因: