【问题标题】:how do I use socket outside the scope?如何在范围外使用套接字?
【发布时间】:2021-11-18 13:43:01
【问题描述】:

请建议我在不同文件中访问socket 的最佳方式。我正在使用 socket.io。

index.js

io.on("connection", socket => {
  socket.on("message", onMessageRecieved)
})

message.js

    const onMessageRecieved = (payload) => {
        try { 
           console.log(socket.id)
        } catch (error) {
            console.log(error);
        }
    }

我知道这是一种方法。

io.on("connection", socket => {
  socket.on("message", (payload)=>onMessageRecieved(payload, socket))
})

但是有没有其他方法。我需要它,因为我将用户数据保存到socket.uid="ABC_NAME" 之类的套接字,并希望在收到消息后访问。

已编辑:我试图使用中间件来做同样的事情。下面的代码有效,但是在使用套接字时出现错误“超出最大调用堆栈大小”。

//a = socket, x= socket.on()
    let a = { 
        z : 1,
        x : function(m=1, n) {
            n(m, a)
        }
    }
    
    let e = (arg1, arg2) => {
        console.log(arg1, arg2.z);
    }
    
    a.x(2, e)

【问题讨论】:

  • "但是还有其他方法吗?" - 没有。您找到的解决方案有什么问题?请注意,有多个连接和多个套接字,因此您必须始终将特定套接字显式传递给您的函数才能访问它。没有可用于此的全局变量。
  • 我们可以覆盖中间件内部的函数,这样我就不必每次都这样做了吗?我正在寻找另一种清洁代码的方法。

标签: javascript node.js express socket.io


【解决方案1】:

你可以像onMessageRecieved(socket)一样使用Closure

index.js

io.on("connection", socket => {
  socket.on("message", onMessageRecieved(socket));
});

message.js

const onMessageRecieved = (socket) => {
  return (payload) => {
    try { 
      console.log(socket.id)
    } catch (error) {
      console.log(error);
    }
  }
}

【讨论】:

  • 谢谢。但是,无论如何我们可以在套接字中间件中添加额外的参数吗?如果你找到任何参考。请分享。我正在寻找更干净的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多