(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace:
at Socket.EventEmitter.addListener (events.js:160:15)
at Socket.Readable.on (_stream_readable.js:689:33)
...
var server = http.createServer(function(req,res){
res.writeHead(200, {'Content-type': 'text/javascript'});
req.connection.on('close',function(){
// code to handle connection abort
});
/**
* Here goes some long polling handler
* that performs res.write(' '); from time to time
*/
// some another code...
});
server.listen(NODE_PORT, NODE_LISTEN_HOST);
6条答案
按热度按时间gtlvzcf81#
您需要使用
req.on('close', function(err) { ... });
而不是req.connection.on('close', function(err) { ... });
有一个非常重要的区别。req.on()向这个请求添加一个监听器,而req.connection.on()向客户端和服务器之间的(keep-alive)连接添加一个监听器。如果您使用req.connection.on(),则每次客户端重新使用连接时,您都要向同一个连接添加多个侦听器。当连接最终中止时,所有侦听器都被触发。
函数作用域通常可以防止这种情况破坏服务器逻辑,但它仍然是一件危险的事情。幸运的是,至少NodeJS 0.10.26足够聪明,可以警告用户:
**编辑:抬头!**正如@Matt在评论中提到的,解析
body
会触发request
的'close'
事件,即使响应还没有完成流回客户端。使用res.on('close', ...)
代替。qeeaahzv2#
多亏了 *Miroshko * 和 * yojimbo 87 * 的回答,我才能捕捉到“关闭”事件,但我不得不做一些额外的调整。
仅仅捕获'close'事件并不能解决我的问题的原因是,当客户端向node.js服务器发送请求时,服务器本身无法获得连接是否仍然打开的信息,直到他向客户端发送一些东西(据我所知-这是因为HTTP协议)。
所以,额外的调整是不时地向响应写入一些东西。
还有一件事阻止了它的工作,那就是我把'Content-type'设置为'application/json'。将其更改为“text/JavaScript”有助于在不关闭连接的情况下不时地传输“白色空格”。
最后,我得到了这样的东西:
我的原始代码要大得多,所以我不得不削减了很多,只是为了显示敏感的部分。
我想知道是否有更好的解决方案,但这对我来说是工作的时刻。
wfauudbj3#
在node.js中是否有一种方法来检查或检测或捕获用户放弃请求(关闭连接)时的事件?
您可以尝试使用http.ServerRequest关闭事件。简单的例子:
50pmv0ei4#
你的问题似乎和这个很相似:
NodeJS HTTP request connection's close event fired twice
尝试
33qvvth15#
我使用的是js.js(~4.10.6),下面的代码对我来说工作得很好:
只要我关闭浏览器的标签,浏览器就会关闭连接,回调函数就会按预期执行。
yeotifhr6#
从节点16开始,如果你想检测一个中止信号(如果你的客户端使用了一个fetch
AbortController
),你可以用途:看看这个thread:Client aborts does not trigger "close" event on Node.js request in Node 16指出了这个问题:https://github.com/nodejs/node/issues/38924