我的应用程序中的多个地方都需要socket.io实例。为此,我可以这样做:
app.set('io', io);
现在在koa,我有这个:
app.use( async ( ctx, next ) => {
ctx.io = io;
await next();
});
这可行,但是每次我的服务器收到请求时,该中间件都会执行。有一个更好的方法吗?
答案 0 :(得分:0)
我不知道您如何完全实现,但是您可以做几件事情,您可以传递附加参数并将升级到Websocket的连接,从而绕过其余中间件。或者,我个人所做的就是将任何Websocket连接都连接到另一个端点。这将有助于解决任何将来的可伸缩性问题。例如,如果您需要创建服务器的集群,那么您将拥有更多的控制权,这将有助于您更轻松地测试后端。那就是我至少会做的。我的socket.io后端看起来像这样:
哦,是的,我在后端使用打字稿
require('dotenv').config({ path: __dirname + '/.env' });
import Koa from 'koa';
const koa = new Koa();
import cors from '@koa/cors';
const PORT = process.env.CHAT_PORT || 3000;
const ENV = process.env.NODE_ENV || 'development';
const server = require('http').createServer(app, { origins: 'http://server.ip' });
const io = (module.exports.io = require('socket.io')(server));
import SocketManager from './lib/SocketManager';
app.use(
cors({
origin: '*',
optionsSuccessStatus: 200,
}),
);
// server setup
server.listen(PORT, (err: ErrorEvent): void => {
if (err) console.error('❌ Unable to connect the server: ', err);
console.log(`? Chat server listening on port ${PORT} - ${ENV} environment`);
});
io.on('connection', SocketManager);
然后只需创建一个导入io实例的套接字管理器,然后您就可以继续处理所有连接。
我希望这是您正在寻找的答案/为您提供了更好的见识。