带有Express.js vhost的子域上的Socket.IO

bra*_*sch 2 connect node.js express socket.io

我的服务器上运行了两个Express.js应用程序.

一个名为"main-app"的普通香草应用程序,另一个使用名为"socket-app"的Socket.IO.

我在"socket.mydomain.com"的子域上运行的"mydomain.com"和"socket-app"上运行"main-app"

我通过Express的内置vhost中间件将请求路由到socket-app.

- 在main-app.js里面 -

var express = require('express');
var app = module.exports = express.createServer();
app.use(express.vhost('socket.mydomain', require('./socket-app/app.js')));

app.listen(8080, function(){
  console.log("Express server listening on port %d in %s mode");
});
Run Code Online (Sandbox Code Playgroud)

这工作正常,我可以在socket.mydomain上看到我的socket-app在端口8080上运行

但是,如此处所讨论的,当通过vhost运行Socket.IO应用程序时,websockets超时并且没有收到"升级"事件似乎存在问题.

所以我的问题是如何将这个"升级"事件从我的主应用程序传输到我的socket应用程序,以便所有连接的套接字都可以听到有人连接和断开连接?

我尝试从"主应用程序"中发出"升级"事件,但它似乎没有起作用.

app.on('upgrade', function(req, socket) {
    socket.emit('upgrade', app);    
});
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

bra*_*sch 7

解决方案是在根应用程序中创建一个Socket.IO实例,该实例可以由子域应用程序全局访问,然后在其自己的Socket.IO命名空间中运行每个应用程序以保留其自治权.

我刚刚构建了一个简单的示例,它运行三个聊天应用程序实例,它们共享同一个Socket.IO实例,该实例在根应用程序中声明.

如果克隆项目并按照说明设置本地子域,则可以看到聊天应用程序的每个实例都独立于其他实例运行.

我将尝试撰写博客文章,详细介绍明天上午的工作原理.

更新

这是一篇关于如何跨多个域共享Socket.IO实例的文章.