Ниже приведен мой файл 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.
Кроме того, я бы принял вызовиметь очень распространенный;тем не менее, я не смог найти много решений для решения этой проблемы и ни одного, которые бы предлагали использовать глобальную переменную.