Генератор Node.js Express 4 с файлами Mutliple Socket.io
Я разбил свое приложение на модули, чтобы добавить его в будущем. Я использую экспресс 4 с генератором и сталкиваюсь с проблемами с добавлением моих нескольких слушателей socket.io.
В /bin/www
app.io.attach(server);
В app.js
var app = express();
//call socket.io to the app for each route
app.io = require('./socket.io/file1');
app.io = require('./socket.io/file2');
app.io = require('./socket.io/file3');
Все отлично работало, пока я не попытался добавить более одного исходного файла socket.io. Тогда работает только последний. Я предполагаю, потому что app.io сбрасывается при каждом вызове.
Какой лучший способ пойти по этому поводу? Я хочу, чтобы мой код как можно больше ломался.
1 ответ
Вы перезаписываете app.io каждый раз. app.io = require('./socket.io/file1');
не "вызывает socket.io", но назначает app.io этому модулю. Есть несколько способов решить эту проблему, например:
в app.js:
app.io = [
require('./socket.io/file1'),
require('./socket.io/file2'),
require('./socket.io/file3')
]
в /bin/www:
app.io.forEach(function (socketIo) {
socketIo.attach(server);
});
Это присваивает массив app.io и / bin / www выполняет итерации по массиву, чтобы подключить сервер к каждому экземпляру socket.io.
Я не мог проверить, работает ли это, и я подозреваю, что это не так (я написал это просто для иллюстрации первой проблемы в вашем коде). Я думаю, что можно использовать только один экземпляр socket.io для каждого http-сервера. Но есть решение:
ТЛ; др
Используйте пространства имен socket.io. Создайте один экземпляр socket.io и прикрепите его к серверу, как вы это уже делаете, затем создайте "подмодули" через io.of("/module-name")
в каждом из файлов вашего модуля (например, file1 и т. д.). Пожалуйста, прочитайте документацию, чтобы узнать больше о пространствах имен.
Обновить:
Для этого снова есть несколько вариантов, например: (Предупреждение, код взят из одной из моих собственных кодовых баз, изначально написан на coffee-script и переведен в мою голову, но вы должны понять суть)
в кофеварке
var io = require('socket.io')(http)
require('./broadcast.coffee')(io)
require('./livelog.coffee')(io)
Где http, конечно, ваш экземпляр http-сервера.
в эфире
module.exports = function (io) {
var broadcast = io.of('/broadcast')
broadcast.on('connection', function (socket) {
socket.emit('foo', 'bar')
})
}