Генератор 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')
    })
}
Другие вопросы по тегам