在koa中有express的app.set('something',something)类似物吗?

时间:2019-10-01 08:57:36

标签: koa koa2

我的应用程序中的多个地方都需要socket.io实例。为此,我可以这样做:

app.set('io', io);

现在在koa,我有这个:

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

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

1 个答案:

答案 0 :(得分:0)

我不知道您如何完全实现,但是您可以做几件事情,您可以传递附加参数并将升级到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实例的套接字管理器,然后您就可以继续处理所有连接。

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