【问题标题】:How to detect user cancels request如何检测用户取消请求
【发布时间】:2011-04-25 00:11:51
【问题描述】:

我正在通过编写一个非常基本的 http/web 缓存代理来尝试 Node.js,并且遇到了一些我无法突破的东西。

假设我有一个非常基本的代理功能(监听请求,将其传送到外部服务器,等待响应,将其传送回客户端),我如何检测客户端(Web 浏览器)何时取消请求?当用户在其浏览器上单击“停止”/Esc 时,浏览器不会向我发送任何“请求”或信息,并且不会调用“响应”连接结束时的回调。

这就是我的意思:

http.createServer (clientRequest, clientResponse) {  
    var client = http.createClient (port, hostname);
    var request = client.request (method, url, headers);  

    request.addListener ('response', function(response){  
        response.addListener ('data', function(chunk){  
           // forward data to clientResponse..
        }  
        response.addListener ('end', function(){   
           // end clientResponse..  
        }  
    });  
    clientResponse.addListener('end', function(){  
        // this never gets called :(
        // I want it to terminate the request/response created just above  
    }
}

【问题讨论】:

  • 您是否考虑过使用像 Socket.IO 这样的 WebSocket 实现?使用 Socket.IO 管理(启动/停止)连接非常容易
  • createServer 中的那些参数不应该是(serverRequest, serverResponse) (nodejs.org/api/http.html#http_event_request) 吗?您应该绑定的是serverRequest(如下所述的“关闭”事件)。另外,您为什么要在 server 请求处理程序中创建 client ?除非您正在调用外部 API,否则您的服务器似乎会创建一个内部客户端,当最初从 外部 客户端(即浏览器)触发时,该客户端会(递归地)调用自身?
  • @Hari:就像我提到的,这是一个代理。我的目标是接收来自外部客户端(浏览器,我称之为“clientRequest”)的请求,然后分析/修改请求并转发它。所以在分析/修改/缓存/无论如何之后,我需要创建一个新请求:client.request。所以:clientRequest 是来自浏览器的请求,client.request 是新转发的请求。我希望这能清除它。 (这里没有递归!)
  • 谢谢@Cyclonus。为了清楚起见,我建议它不再是“客户端”请求,而是在服务器收到它后变成“服务器”请求。无论如何,最好的名称由您决定,但您所称的 clientResponse(又名响应客户端或来自服务器)在您的控制之下,因此不应该发生任何事件除非您的代码启动它,否则会调用它。这是你的clientRequest,你想绑定它来检测浏览器取消,我很确定。你有没有让这个以另一种方式工作?
  • @Hari:我需要一些时间才能找到代码(此时这个问题已经将近 2 年了 :)),但我相信我最终绑定到了 close 所有请求和响应的事件。我认为绑定到 clientRequest 以检测用户何时取消他的请求可能是正确的,但我还需要绑定到所有请求和响应以用于其他目的(日志记录、统计信息等)。

标签: http proxy node.js


【解决方案1】:

原来我应该绑定到请求的“关闭”事件而不是“结束”事件。 这确实有道理。
我在这里为可能遇到相同问题的其他人发布此信息:

clientResponse.addListener('close', function(){  
    // this gets called when the user terminates his request  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多