【发布时间】:2021-06-30 15:30:46
【问题描述】:
我正在开发一个聊天应用程序(使用 NodeJS + Socket.IO)。
在我的服务器中,我有一个名为 users 的数组变量,用于存储所有在线用户。
当用户登录时,一个包含所有用户信息的对象被推送到 users 数组中,当它退出时,会发出一个 'user_logout' 事件:
var users = []; //array of online users
io.on('connect', (socket) => {
socket.on('user_login',(user)=>{
//USER LOGS IN
users.push(user)
})
socket.on('disconnect',()=>{
//USER LOGS OUT
var message = socket.id + "logs out"; // ERROR: socket is undefined
io.emit('user_logout',message)
})
})
从我上面的 sn-p 可以看出,socket 对象似乎是未定义的,导致我的应用程序崩溃。
只有当用户有一段时间不活动(比如说几分钟)时才会抛出错误,否则它可以正常工作!
似乎socket在没有警告的情况下破坏了空闲连接,导致对象socket为空
【问题讨论】:
-
socket.emit将发送到当前正在断开连接的套接字,您需要socket.broadcast.emit代替,另外您不要从用户数组中删除断开连接的用户 -
要清楚,当
socket断开连接时,您想向那个 same 套接字发送一条新消息,但它不会收到它,因为它已断开连接?一种解决方法是简单地存储id,这样您就不需要通过socket对象 -
我不小心写了 socket.emit 而不是 io.emit。无论如何问题总是一样的,socket是一个未定义的对象
-
我从来没有遇到过这种情况。但是尝试使用
this而不是socket
标签: javascript sockets socket.io