今天使用express创建聊天室其他功能的时候,发现一个io.emit(‘disconnect’)的方法报错了,报错信息如下:
throw new Error(`"${String(ev)}" is a reserved event name`);
^
Error: "disconnect" is a reserved event name
at BroadcastOperator.emit (D:\expressframe\myexpressjsj\node_modules\socket.io\dist\broadcast-operator.js:159:19)
at Namespace.emit (D:\expressframe\myexpressjsj\node_modules\socket.io\dist\namespace.js:307:73)
at Server.<computed> [as emit] (D:\expressframe\myexpressjsj\node_modules\socket.io\dist\index.js:806:33)
at Socket.<anonymous> (D:\expressframe\myexpressjsj\scoketio:19:16)
at Socket.emit (node:events:390:28)
at Socket.emitReserved (D:\expressframe\myexpressjsj\node_modules\socket.io\dist\typed-events.js:56:22)
at Socket._onclose (D:\expressframe\myexpressjsj\node_modules\socket.io\dist\socket.js:561:14)
at Client.onclose (D:\expressframe\myexpressjsj\node_modules\socket.io\dist\client.js:247:20)
at Socket.emit (node:events:402:35)
at Socket.onClose (D:\expressframe\myexpressjsj\node_modules\engine.io\build\socket.js:310:18)
这个是啥意思呢,大概就是有一个保留字被用到了,然后查看第一个报错地方是emit使用disconnect的时候,因为我在前端定义一个disconnect方法用来广播用户的退出信息,所以我在后端监听disconnect的时候,不仅要在后台报消息,还要使用io.emit()方法向所有socket用户触发他们各自的disconnect方法,但是居然报错了!所以查一下官网,大概就是说,disconnect可以在后台使用socket.on监听,但是不能使用在emit中,那就好解决了呗!我们不能使用emit触发disconnect方法,那我们在前端定义这个方法的时候,把disconnect这个名字改掉不就行了,所以我换成logout,表示登出,然后再修改后端里面的emit的内容就没问题了。
后端
socket.on('disconnect',function()
{
console.log(socket.userid+'已经退出聊天室');
io.emit('logout',socket.userid)
})
前端
this.socket.on('logout',function(userid)
{
console.log(userid+'退出聊天室!');
})
没问题就是下面介个样子:
浏览器