Должен ли я использовать глобальную переменную для совместного использования экземпляра socket.io на всем сервере - PullRequest
0 голосов
/ 28 октября 2018

Ниже приведен мой файл server.js в моем приложении node.js.Я хочу, чтобы к моему экземпляру socket.io обращались другие файлы на моем сервере для отправки событий из моего API (listingRoutesApi, userRoutesApi etc.) (refer to code).

У меня проблема в том, что мои маршруты объявляются до создания сервера;однако экземпляр socket.io создается после создания сервера.

Решение, которое я использовал, - объявить глобальную переменную io, которая позволит мне отправлять события изгде-нибудь в моем веб-приложении, например, так:

global.io.of('/analytics').to(listing._id).emit('message', "There was a post.");

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

Код в моем файле server.js:

const app = express();    

app.use('/api', listingRoutesApi);
app.use('/api', userRoutesApi);
app.use('/api', imageRoutesApi);
// ...plenty more endpoints here...

app.use(serveStatic(path.join(__dirname, "/dist")));
app.use(history());
app.use(serveStatic(path.join(__dirname, "/dist")));

const server = app.listen(port, () => { console.log('server started ' + port); });

/* Start socket. */
global.io = socketio(server);

const analytics = global.io.of("/analytics");

analytics.on('connection', (socket) => {
    socket.on('join', (data) => {
        socket.join(data.room);
        analytics.in(data.room).emit('message', `New user joined ${data.room}`);
    });
    socket.on('leave', (data) => {
        analytics.in(data.room).emit('message', `User leaving ${data.room}`);
        socket.leave(data.room);
    });
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});

Я задаю этот вопрос, поскольку это ТАКpost отвечает на аналогичный вопрос, объявляя функцию getIOInstance и передает ее всем модулям, которым она требуется.Хотя он работает, он не выглядит очень элегантно и кажется немного излишним, учитывая, что я ожидаю, что в моем приложении будет только один экземпляр socket.io.

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

1 Ответ

0 голосов
/ 28 октября 2018

Node.js - это модульная среда.Предполагается, что модули устраняют некоторые недостатки, которые есть у глобалов.

Модули, естественно, предоставляют единичные экземпляры, в случае необходимости иметь только один экземпляр:

app.js

module.export = express();

server.js

const app = require('./app');

module.export = app.listen(...);

socketio.js

const server = require('./server');

module.export = socketio(server);

index.js

const app = require('./app');
const io = require('./socketio');
...

Express также предоставляет контейнер для глобальных зависимостей приложения, таблица настроек приложения .Его можно использовать везде, где доступен экземпляр приложения, например, как req.app.get(...) внутри промежуточного программного обеспечения.Доступ к экземпляру приложения Express из промежуточного программного обеспечения также не будет проблемой, если он также является синглтоном:

app.js

module.export = express();

index.js

const app = require('./app');

...

const server = app.listen(...);
const io = socketio(server);

app.set('io', io);

// available as req.app.get('io') inside middlewares
// and as require('./app).get('io') outside them
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...