【问题标题】:Advanced - Socket.io Join Room in external file on HTTP request高级 - Socket.io 根据 HTTP 请求在外部文件中加入 Room
【发布时间】:2022-11-04 03:49:01
【问题描述】:

我对这个 Node.js、Angular 13 和 Socket IO 场景感到困惑。 首先让我们假设我们已经将所有需要的信息保存在数据库中,比如房间号,房主,用户名等等

因此,假设我们要创建一个使用套接字同步所有玩家的在线测验游戏,此场景最多 6 个。然而,这就是问题所在……

  1. 在 Angular 代码中有这个服务正在连接客户端
    带后端

    套接字服务.ts

         export class SocketService {
            
            socket: any;
            readonly url: string = "ws://localhost:3000";
        
          constructor() { 
              this.socket = io(this.url)
          }
        }
    
    1. 在服务器端 index.js 初始化 webSocket

    index.js

    const app = express();
    const io = require('./sockets/websocket')(app);
    
    1. 在 webSocket.js 中,我们创建了 socketIO 实例,以便根据需要在整个后端控制器中导出和使用

    webSocket.js

    
    module.exports = function(app){
        this.server = require('http').createServer(app);
        this.socket = require('socket.io');
        this.io = socket(server, {
          cors: {
            origin: "https://localhost:4200",
            credentials: true
          }
        });
    
        this.server.listen(3000, () => {
            console.log("Socket IO is lestineng on port 3000");
        });
    
        io.on("connection", function (socket) {
            console.log("A user connected");
        });
    
        this.registerSocketToRoom = function(roomId){
            try{
                console.log('[socket]','join room :',roomId)
                io.join(roomId);
                io.sockets.to(roomId).emit('user joined', socket.id);
            }catch(e){
                console.log('[error]','join room :',e);
                io.emit('error','couldnt perform requested action');
            }
        } }
    
    
    1. 这是一个示例控制器。我们导入从 webSocket.js 文件中导出的 SocketIO 的导出实例。假设我们想加入一个房间,如果客户端发出一个 http 请求加入一个房间然而,我们没有加入房间“插座连接”所以我们现在必须这样做。我们尝试使用导出的方法 {registerSocketToRoom}。

    GameRoomManagerController.js

        require('../../sockets/websocket');
         
       ... // Some code here
    
        exports.joinGameRoom = function(req, res){
            const roomId = req.params.roomId;
            console.log(roomId);
            registerSocketToRoom(roomId);
            return res.send({status: "success", msg: `joined Room: ${roomId}` });
    
        }
    

    在执行创建房间的过程 -> 将信息保存到数据库 -> 加入房间时,会发生以下错误。

    TypeError:io.sockets.join 不是函数

    从理论上讲,这对我来说是正确的,但我认为我误解了 io 和 socket 之间的区别。

    • 有人可以向我解释这里发生了什么吗?有没有可能 导出相同的 io 实例以用于 后端?

    • 甚至可以加入一个房间连接是 创建?

    • io和socket有什么区别?

【问题讨论】:

    标签: node.js angular express sockets socket.io


    【解决方案1】:

    在开始这个话题之前,最好先熟悉一些来自 socket.io 库的术语

    io

    实际上,它是指连接到服务器的所有套接字。你可以 单独、分组或向所有套接字发送消息。

    你对这样写的socket的想法

    io.on('connection', socket => {
    
        socket.on('message', data => {
        
        });
    
    });
    

    在本节中,您只能阅读与此相关的信息 事件,或者您可以在套接字之间传输此信息

    好吧,现在我们要解决这个问题。此错误的原因不是在您的编码中遵循此层次结构。建议你下次参考socket.io文档,夯实基础。

    最后给大家举个简单的例子说明正确的实现方法

    let app = require('express')(),
        http = require('http').Server(app),
        io = require('socket.io')(http);
    
    let listOfRoom = [];
    
    io.on('connection', socket => {
    
        let joinUserInRoom = (roomId) => {
                if (socket.adapter.rooms.has(roomId) === false) {
                    listOfRoom.push(roomId);
                    socket.join(roomId);
                }
            },
            leaveUserInRoom = (roomId) => {
                if (listOfRoom.includes(roomId)) {
                    listOfRoom.splice(listOfRoom.indexOf(roomId), 1);
                    socket.leave(roomId);
                }
            };
    
        socket.on('joinRoom', data => {
            joinUserInRoom(data.roomId);
        })
    
        socket.on('disconnect', data => {
            leaveUserInRoom(data.roomId);
        });
    
        socket.on('messageRoom', data => {
            io.to(data.roomId).emit('eventMessageRoom', data); // send data in special room
        });
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多