以下是我的 node.js 应用程序中的 server.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');
});
});
我问这个问题是因为这个帖子 https://stackoverflow.com/questions/36676815/nodejs-socketio-multiple-files通过声明来回答类似的问题getIOInstance
函数并将其传递给所有需要它的模块。虽然它确实有效,但感觉不是很优雅,而且似乎有点不必要,因为我希望我的应用程序中只会有一个 socket.io 实例。
此外,我认为我面临的挑战是一个非常常见的挑战;然而,我还没有找到很多解决方案来解决这个问题,也没有一个建议使用全局变量。