Socket.IO на поддоменах с Express.js vhost

У меня есть два приложения Express.js, работающие на моем сервере.

Простое ванильное приложение под названием «main-app» и другое, использующее Socket.IO, под названием «socket-app».

У меня есть «основное приложение», работающее на «mydomain.com», и «socket-app», работающее на поддомене на «socket.mydomain.com».

Я направляю запросы в приложение-сокет через встроенное промежуточное ПО Express vhost.

-- внутри 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");
});

Это отлично работает, и я вижу, что мое приложение для сокетов работает на порту 8080 в socket.mydomain.

Однако, похоже, существует проблема с истечением времени ожидания веб-сокетов и отсутствием события «обновления» при запуске приложения Socket.IO через vhost, как обсуждалось здесь

Итак, мой вопрос: как я могу передать это событие «обновления» из моего основного приложения в мое приложение для сокетов, чтобы все подключенные сокеты могли слышать, когда кто-то подключается и отключается?

Я попытался создать событие «обновление» из «основного приложения», но, похоже, оно не работает.

app.on('upgrade', function(req, socket) {
    socket.emit('upgrade', app);    
});

Что мне здесь не хватает?


person braitsch    schedule 20.05.2012    source источник
comment
Итак, я понял. Поскольку Socket.IO и Express.vhost, похоже, не хотят хорошо работать вместе, кажется, что решение состоит в том, чтобы использовать создание экземпляра Socket.IO в вашем основном приложении, а затем передавать этот экземпляр в другие ваши приложения, которые должны взаимодействовать через сокеты. . Я скоро напишу пример в своем блоге.   -  person braitsch    schedule 22.05.2012
comment
Потрясающий! Можете ли вы также опубликовать быстрый ответ на свой вопрос и принять его? См. blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange.   -  person Daniel Mendel    schedule 28.05.2012


Ответы (1)


Решение состоит в том, чтобы создать один экземпляр Socket.IO в вашем корневом приложении, к которому ваши приложения поддомена могут получить глобальный доступ, а затем запустить каждое приложение в своем собственном пространстве имен Socket.IO, чтобы сохранить их автономию.

Я только что создал простой пример, который запускает три экземпляра приложения чата, использующие один и тот же экземпляр Socket.IO, который объявлен в корневом приложении.

Если вы клонируете проект и следуете инструкциям по настройке локальных поддоменов, вы можете увидеть каждый экземпляр приложения чата работает независимо от других.

Завтра утром я постараюсь написать сообщение в блоге с более подробной информацией о том, как это работает.

Обновить

Вот описание того, как совместно использовать экземпляр Socket.IO в нескольких доменах.

person braitsch    schedule 15.06.2012