【问题标题】:How to use socket after connect event in socket.io?socket.io 中的连接事件后如何使用套接字?
【发布时间】:2022-11-04 02:55:03
【问题描述】:

对不起我的英语不好。 这儿存在一个问题。在我的 app.js 服务器中,我添加了套接字,我使用了 join 事件,在 'connection' 事件中是一个将套接字作为参数的函数,但是,我想将用户推入一个房间,但是这个名称room 在我的服务器的 REST API 部分的模型中可用(来自会话)。 问题。如何在我的 REST API 模型中获取和推送已连接到正确房间的用户? (每当用户请求页面时,都会触发此模型及其服务,比方说授权检查的类似物)。除了这个问题,还有另一个服务和模型负责添加,例如,某种任务,这也是一个 REST API,所以在这个模型中,我想向所有必要的用户发送消息已添加任务的套接字,除了发送者本人目前我什么都做不了。一般是发给所有人的,包括发送者,连接中的socket在REST API模型中是不能抛出的 应用程序.js

io.on('connection', (socket) => {
  app.set('socket', socket);

  socket.on('disconnect', () => {
    socket.disconnect(true);
  });
});

向所有服务和模型中的服务发送数据的控制器

const controller = (ServiceClass, params) => {
    return async (req, res, next) => {
        const service = new ServiceClass({
            session: req.session,
            sessionId: req.sessionID,
            cookies: req.cookies,
            socketIo: req.app.get('socketio'),
            socket: req.app.get('socket'),
        });

        const response = await service.run(params(req));
        res.json(response);
    };
}

export default controller;

在用户对网站的每个请求都会触发的模型内部,在这里我试图提供合适的空间

export default class IsLoggedService extends Service {
    constructor(context) {
        super(context);
    }

    async execute() {
    
    this.context.socket
      .join(`room${userSession.roleId}`);
    }
}

我也从其余 api 服务 + 模型向客户端发送有关创建任务的信息

    this.context.socket
            .to(`room${userSession.roleId}`)
            .emit('test', 'test');

我已经查看了整个 socket.io 文档,它到处都说为了向除了你自己之外的所有人发送消息,你需要使用套接字,但这根本不起作用,它会发送给每个人,包括发送者,我也试过在service和model里面实现一个socket,都无济于事

【问题讨论】:

    标签: javascript ajax rest sockets socket.io


    【解决方案1】:

    最符合逻辑的实现方式就是你通过socket发送消息时接收到的json对象接收所有的用户,根据数据实现程序的逻辑。

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2015-11-23
      • 1970-01-01
      • 2018-06-03
      • 2020-11-11
      • 2014-06-20
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多