【问题标题】:Stop the execution of a cancelled request in Express在 Express 中停止执行已取消的请求
【发布时间】:2015-03-18 09:26:16
【问题描述】:

我正在创建一个应用程序,它向另一台服务器发出大量 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 来显示回调机制。这不是真正的代码。

感谢您的帮助。

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

    根据文档,“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();
        });
    });
    

    【讨论】:

    • 谢谢你的回答,但我认为有一个误解。当客户端关闭连接时,我想退出节点应用程序,以便不再向 something.com 发起任何进一步的请求,不想中止特定请求。
    • @onum 如果用户取消请求,您真的要退出整个节点应用程序吗?
    • 不是整个应用程序,只针对这个请求防止新的回调调用。
    • @onum 这正是我的代码应该实现的。我不确定为什么你的请求处理程序中有一个 setTimeout 函数。那是做什么用的?你每秒发出 10 次 http 请求,还是模拟一个长请求?
    • 是的,它是对多个请求的模拟。在一次通话中,我必须执行 200 个请求。所以你可以认为是一个迭代到 200 的 for 循环,并且每个循环都有一个 http 请求和回调。马上会有200个请求
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2018-11-12
      相关资源
      最近更新 更多