在koa中是否有快递的app.set('something',something)的类似物?



我需要在我的应用程序中的多个位置 socket.io 实例。为了快速实现这一点,我可以这样做:

app.set('io', io);

现在在 koa 中,我有这个:

app.use( async ( ctx, next ) => {
ctx.io = io;
await next();
});

这有效,但是每次我的服务器收到请求时都会执行此中间件。有没有更好的方法可以做到这一点?

我不知道你是如何完全实现的,但你可以做的几件事是你可以传递一个加法参数,并将连接升级到一个将绕过其余中间件的websocket。或者,我个人所做的只是让任何 websocket 连接转到不同的端点。这将有助于解决任何未来的可伸缩性问题。例如,如果您需要创建服务器的集群,那么您也将拥有更多的控制权,这将有助于您更轻松地测试后端。我至少会这样做。我的 socket.io 后端如下所示:

服务器.ts

哦,是的,我在后端使用打字稿

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实例的套接字管理器,然后您就可以继续处理所有连接。

我希望这是您正在寻找的答案/为您提供更好的见解。

最新更新