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

10

在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个回答

13

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

@JoaoPintoJeronimo 你会发现,express的 reqres 对象扩展了node.js核心中的原生 HTTPRequestHTTPResponse 对象。因此可以回退到这些方法。 - Raynos
3
在Express 4中不再工作,请参见我的帖子。简而言之,使用 on-finished 中间件。 - Ahmed Fasih

11

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


1
这个说法已经不再正确,或者至少在Express 4.x文档中仍然间接引用了req.on('close', ...)"req对象是Node自己请求对象的增强版本,并支持所有内置字段和方法。" - JM-AGMS

1
使用express 4.X,它是req.on("end", () => {}),最好将其添加为express中间件。
是的,但on-finished npm包也可以使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接