我使用JQuery请求(xhr)长时间轮询node.js路由。这将向我的Express服务器发送一个GET请求,并侦听消息总线事件。我正在对GET请求设置一个超时(因为我的代理会扼杀长请求)。因此,在超时之后,客户端应该将一个中止事件发送到服务器。
我希望捕获该中止/关闭/完成事件,并删除相关的消息总线侦听器/订阅者。
但我很挣扎。我试过req.on(“关闭”)完成的npm模块,但对我来说不管用。在阅读节点:https://nodejs.org/api/http.html的http文档之后,我也不太聪明了。
有什么办法对付这只野兽吗?还是删除侦听器以防止内存泄漏的更好方法?
服务器端要点:
// server.js
var express = require("express");
var EventEmitter = require("events").EventEmitter;
var messageBus = new EventEmitter();
messageBus.setMaxListeners(20);
var REST_PORT = (process.env.PORT || 5000);
var app = express();
app.get("/events", (req, res) => {
var listener = function(res) {
messageBus.once("message", function(data) {
res.status(200).json(data);
});
};
req.on("abort", function() { //I tried also "aborted", "close", "closed", "finish", "finished"..no luck
messageBus.removeListener("message", listener);
});
listener(res);
console.log("Total listeners to 'message' events:", messageBus.listeners("message").length);
});
// other messageBus.emit logic ..
app.listen(REST_PORT, () => {
console.log("Application ready on port " + REST_PORT);
});
客户方基本要素:
//client.js
$.ajax({
method: "GET",
async: true,
url: "/events",
success: function(data) {
callback(data);
},
complete: function(request, status, err) {
if (status == "timeout" || status == "success") {
console.log("LOG: Normal long-polling timeout or successful poll, continuing.");
longPoll();
} else {
console.warn("WARN: Server probably offline, retrying in 2 sec.");
setTimeout(function() {
longPoll();
}, 2000);
}
},
timeout: 30000
});
谢谢!
发布于 2017-04-09 02:44:08
我建议完全中止自定义的长轮询系统,并使用现有的消息传递/套接字类型系统之一。有许多是完全形成的。socket.io仍然是最受欢迎的,而且运行良好,但是有些替代方案,比如alternatives/,可能会更好
https://stackoverflow.com/questions/43301389
复制相似问题