首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node.js:使用EventEmitter和Express 4.x的长轮询捕获请求关闭

Node.js:使用EventEmitter和Express 4.x的长轮询捕获请求关闭
EN

Stack Overflow用户
提问于 2017-04-08 23:23:33
回答 1查看 4.4K关注 0票数 1

我使用JQuery请求(xhr)长时间轮询node.js路由。这将向我的Express服务器发送一个GET请求,并侦听消息总线事件。我正在对GET请求设置一个超时(因为我的代理会扼杀长请求)。因此,在超时之后,客户端应该将一个中止事件发送到服务器。

我希望捕获该中止/关闭/完成事件,并删除相关的消息总线侦听器/订阅者。

但我很挣扎。我试过req.on(“关闭”)完成的npm模块,但对我来说不管用。在阅读节点:https://nodejs.org/api/http.html的http文档之后,我也不太聪明了。

有什么办法对付这只野兽吗?还是删除侦听器以防止内存泄漏的更好方法?

服务器端要点:

代码语言:javascript
运行
复制
// 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);
});

客户方基本要素:

代码语言:javascript
运行
复制
//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
});

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-04-09 02:44:08

我建议完全中止自定义的长轮询系统,并使用现有的消息传递/套接字类型系统之一。有许多是完全形成的。socket.io仍然是最受欢迎的,而且运行良好,但是有些替代方案,比如alternatives/,可能会更好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43301389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档