express框架中socket.io使用disconnect报错的问题解决

今天使用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+'退出聊天室!');
        })

没问题就是下面介个样子:
在这里插入图片描述
浏览器
在这里插入图片描述

好的,下面是使用 TypeScript 和 Socket.IOExpress.js 创建 WebSocket 服务器的示例代码: 首先,确保你已经安装了 TypeScript、Express.js 和 Socket.IO: ``` npm install typescript express socket.io ``` 在项目根目录下创建一个 `tsconfig.json` 文件,用于配置 TypeScript 编译器: ```json { "compilerOptions": { "target": "es6", "module": "commonjs", "outDir": "./dist", "esModuleInterop": true }, "include": ["./src"] } ``` 接着,在项目根目录下创建一个 `src` 目录,并在其创建一个 `index.ts` 文件,用于启动 Express.js 应用程序和 WebSocket 服务器: ```typescript import * as express from "express"; import * as http from "http"; import * as socketio from "socket.io"; const app = express(); const server = http.createServer(app); const io = socketio(server); io.on("connection", (socket) => { console.log("A user connected"); socket.on("disconnect", () => { console.log("User disconnected"); }); }); server.listen(3000, () => { console.log("App listening on port 3000"); }); ``` 在上面的代码,我们创建了一个 Express.js 应用程序、一个 HTTP 服务器和一个 Socket.IO 服务器。然后,我们在 `io.on("connection")` 回调函数处理 WebSocket 连接和断开连接事件。 最后,修改 `package.json` 文件的 `"start"` 命令,让 TypeScript 编译器编译 TypeScript 代码,并启动 Express.js 应用程序和 WebSocket 服务器: ```json { "name": "typescript-socketio-example", "version": "1.0.0", "scripts": { "start": "tsc && node ./dist/index.js" }, "dependencies": { "express": "^4.17.1", "socket.io": "^4.0.1" }, "devDependencies": { "typescript": "^4.3.4" } } ``` 现在,运行 `npm start` 命令,你应该能够在浏览器打开 `http://localhost:3000`,并在控制台看到 WebSocket 连接和断开连接事件的日志输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值