Javascript node js express:请求数据无效?
有人能给我解释一下下列行为的原因吗 我有一个nodejs/express Web服务器,假设其中一个post路由包含以下代码: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'); }) },
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?最新的节点版本,非确定性适用于所有提到的操作系统(测试服务器尝试全部)。。。我也认为它应该起作用,但它没有起作用,这就是我问题的目的。然而,我在这里找到了原因: