ExpressJS:如何知道请求何时完成?

时间:2011-08-15 08:20:00

标签: javascript node.js setinterval express

在NodeJS上设置的ExpressJS中,我有一些像这样的代码:

app.get('/keys/readresults/:keyname', basic_auth, function(req,res){
    res.writeHead(200, {'content-type': 'text/json'});
    setInterval(
        go_to_database_and_get('stuff', function (database_replies) {
        res.write(database_replies)
        })
    ,5000);
});
为了简单起见,代码就是这样写的(如果有人想要真正的代码,我很乐意将它发布在一些pastebin中)。

当我curl -u username:password http://localhost:4000/keys/readresults/key正是我想要发生的事情时会发生什么:我得到一个200状态标题,它会检查数据库中我想要的任何结果并将响应写回给我,然后等待5秒并搜索对于数据库中的新结果并再次写入响应,等等每隔5秒钟。

问题是当我退出curl时,循环会一直持续下去。 如果请求结束,我如何告诉express或nodejs它应该结束该循环(我猜是clearInterval)

3 个答案:

答案 0 :(得分:7)

req.on("close")

如此简单

app.get('/keys/readresults/:keyname', basic_auth, function(req,res){
    res.writeHead(200, {'content-type': 'text/json'});
    var no = setInterval(
        go_to_database_and_get('stuff', function (database_replies) {
        res.write(database_replies)
    });
    ,5000);
    req.on("close", function() {
        clearInterval(no);
    });
});

答案 1 :(得分:7)

req.on('close', ...)在Express 4中不再有效。使用on-finished中间件。

答案 2 :(得分:0)

对于Express 4.X,它是req.on("end", () => {}),最好将其添加为Express中间件。

是的,但是on-finished npm软件包也可以使用。