使用socket.io避免循环依赖

时间:2016-08-28 19:25:26

标签: node.js socket.io ecmascript-6 circular-dependency

我正在用socket.io和node构建一个项目。事件被发送到套接字然后有一些逻辑导致对数据库的修改和套接字上发出的更多事件。我知道如何实现这些部分,但我真的在努力保持每个组件分离并避免循环依赖。我知道我需要一个仅用于处理数据交互的数据模型,因此我可以轻松切换处理数据交互的方式。我想将套接字与逻辑分开。我的问题是使用socket.io我需要声明引用逻辑的处理程序,但在该逻辑中我需要引用socket来发出事件。

我有一些想法:

  • 使用逻辑将套接字对象注入每次对该类的调用。
  • 创建一个类以包含需要发出的事件 从调用逻辑返回,然后套接字调用它们。

这些似乎不必要地重复和复杂。有没有一种标准的方法来处理这种事情?

1 个答案:

答案 0 :(得分:0)

经过一番思考,我已经达到了我认为合理的解决方案。这是一个socket模块的实现,它接受onConnection函数和一个命名监听器函数数组。它需要一个快速应用程序,这是应用程序参数。我使用passportSocketIo进行授权。如果您没有实现身份验证,请忽略身份验证位。它有点粗糙,但它的工作原理。处理程序可以包含您的所有逻辑。

import Server from 'socket.io';
import passportSocketIo from 'passport.socketio';
import cookieParser from 'cookie-parser';

// Configured redisStore for authentication
import {redisStore} from '../lib/sessions';

// Configured passport strategy for authentication
import passport from '../lib/passport';

export default function Socket(app, port, onConnection, listeners) {
  // Setup socket
  var server = new Server();
  var io = server.listen(app.listen(port));

  // Setup authentication
  io.use(passportSocketIo.authorize({
    key: 'connect.sid',
    secret: 'censored',
    store: redisStore,
    passport: passport,
    cookieParser: cookieParser,
    success: (data, accept) => accept(null, true),
    failure: (data, message, err, accept) => {console.log(err); if(err) throw new Error(message);}
  }));

  // On connection listener
  io.sockets.on('connection', function (socket) {

    // Call the handlers method for new connections
    onConnection(socket);

    // Create listeners for all of the listeners
    listeners.forEach((listener) => {
      socket.on(listener.name, listener);
    });
  });

  return io;
}