Socket.IO 弹出窗口关闭时连接断开

Socket.IO connection disconnects when pop up is closed

我正在使用 Firefox 48,它对于 WebExtensions 应该是稳定的。我已将我的测试应用程序连接到 Socket.IO。一旦我关闭弹出窗口,socket.IO 连接就会中断。这是代码:

manifest.json

{
    "manifest_version": 2,
    "name": "myapp",
    "version": "1.0",
    "browser_action": {
        "default_icon": {
            "96": "button/icon.png"
        },
    "default_title": "myapp",
    "default_popup": "popup/main.html"
    }
    "background": {
        "scripts": ["myclient.js"]
    }
}

main.html

<body>
<script src="/scripts/socket.io.js"></script>
<script src="/scripts/jquery-2.2.4.min.js"></script>
<script src="/myclient.js"></script>
</body>

myclient.js

var address = "localhost";
var client = io("http://" + address + ":17001/");
client.on("message", function () {
    $("#test").text("message");
});

我的nodeJS服务器代码

console.log("Server started");
var io = require("socket.io")(17001);
io.on("connection", function (socket) {
    var address = socket.request.connection.remoteAddress;
    console.log("Someone joined. Socket ID:", socket.id, address);
    io.emit("message");
    socket.on("disconnect", function () {
        console.log("Someone disconnected!");
    });
});

如何阻止连接断开? TIA

编辑: 还尝试了与 chrome 相同的扩展,因为我读到 here firefox 不支持 background,但是连接断开的问题仍然存在。

编辑 2: 按照安德鲁所说更新了我的代码,但仍然不起作用:

"background": {
    "scripts": ["myclient.js", "/scripts/socket.io.js", "/scripts/jquery-2.2.4.min.js"],
    "page": "bgp.html"
}

我也通过注释 scripts 行尝试了上面的代码,仍然不起作用。
bgp.html

<!DOCTYPE html>
<html lang="en">
<body>
<script src="/scripts/socket.io.js"></script>
<script>
    var address = "localhost";
    var client = io("http://" + address + ":17001/");
</script>
</body>
</html>

如果我从 myclient.js 中删除连接的创建,连接根本不会发生!这意味着 bgp.html 不工作。

您似乎正在后台页面和弹出页面中加载 myclient.js,但由于您尚未加载 socket.io 库,因此后台页面中的版本将无法使用那里。弹出页面确实加载 socket.io 所以它在那里工作但是弹出页面是短暂的,当弹出窗口被关闭时它被卸载(并且创建的任何 websockets 等被清理)。

您没有说清楚您要做什么,但如果您想要一个长期存在的 socket.io 连接,那么您在后台页面上走在正确的轨道上。最方便的解决方法是创建一个实际的 background.html 页面并添加 <script> 标记以加载 socket.io,然后从后台页面创建套接字并让弹出页面与后台交换消息访问套接字的页面(您使用 runtime.sendMessage() or runtime.connect())。

Also tried the same extension with chrome because I read here that firefox doesn't support background, yet the problem of connection breaking persists.

您链接到的文档是关于 "background" 的权限,Chrome 支持但 Firefox 不支持。 Firefox 确实支持 webextensions 中的背景页面。

作为对原始问题的第二次编辑的回应,您已经接近了,但是后台页面的默认内容安全策略不允许内联脚本。如果您将代码放入单独的 .js 文件并从 <script> 标记中引用它,它应该可以工作