gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:43 25 4
gpt4 key购买 nike

我正在使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com