在Express中停止执行已取消的请求

时间:2015-03-18 09:26:17

标签: javascript node.js express socket.io

我正在创建一个应用程序,它向另一台服务器发出大量HTTP请求,完成其中一个请求可能需要1分钟。有些用户取消了请求,但我的应用仍会执行已取消的请求。

这是我的代码:

var app = express();
app.get('/something', function (req, res) {
    function timeout(i) {
        setTimeout(function () {
            // lets assume there is a http request.
            console.log(i);
            timeout(++i);
        }, 100);
    }
    req.connection.on('close', function () {
        console.log('I should do something');
    });
    timeout(1);
});
app.listen(5000);

基本上,我想要的是在客户端关闭连接后停止console.log(i)调用。此外,如果可能,客户端会省略“close- {id}”事件,并且当后端收到close- {id}事件时,它会终止{id}请求。

注意:我使用setTimeout来显示回调函数。这不是真正的代码。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

从文档中,“http.request()返回http.ClientRequest类的实例。”您可以调用返回对象的abort()方法。 (警告,未经测试的代码)。

var http = require('http'); // This needs to go at the top of the file.

app.get('/something', function (req, res) {
    var remote_request = http.request("www.something.com", function(data){
                             res.writeHeader(200, {"Content-type": "text/plain"});
                             res.end(data);
                         });
    req.on("close", function() {
        remote_request.abort();
    });
});

答案 1 :(得分:2)

将您的setTimeout分配给var,然后在clearTimeout处理程序中使用close。如果可能需要根据您的方法结构进行一些巧妙的重组,例如:

var myTimeout = setTimeout(...)
...
req.connection.on('close', function() {
    clearTimeout(myTimeout);
});