koa中是否有express app.set( 'something', something ) 的模拟?

Is there analog of express's app.set( 'something', something ) in koa?

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

app.set('io', io);

现在在 koa 中我有这个:

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

这行得通,但每次我的服务器收到请求时都会执行此中间件。有一个更好的方法吗?

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

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

我希望这是你正在寻找的答案for/gave你有更好的见识。