node.js - 使用 socket.io 避免循环依赖

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

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

我的一些想法:

  • 通过逻辑将套接字对象注入(inject)到类的每次调用中。
  • 创建一个类来包含需要发出的事件 从对逻辑的调用返回,然后套接字调用它们。

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

最佳答案

经过一番思考,我得出了一个我认为合理的解决方案。这是套接字模块的实现,它采用 onConnection 函数和命名监听器函数数组。它需要一个express app,也就是app参数。我使用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;
}

关于node.js - 使用 socket.io 避免循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39194968/

相关文章:

swift - 当应用程序快速进入后台模式时,如何保持 socket.io 的事件?

javascript - Douglas Crockford 谈 JavaScript 中的 Class Free OOP

javascript - 如何设置 React Native 中固定的菜单大小?

javascript - Sequelize - 在关联的其他地方使用时防止破坏行

javascript - 浏览器 javascript 可以监听路由/url 吗?

javascript - 断开连接时销毁socket.io连接

node.js - 使用 nodejs 推送通知

mysql - 如何编写多行sql查询(nodejs)

javascript - Node js/js : Text not appended in file in sequence

javascript - 使用 Jest 从 Node 模块导入模拟函数的正确方法