On this page
安装websocket插件
具体看课程演示
https://www.npmjs.com/package/egg-websocket-plugin
安装插件
shell
npm i egg-websocket-plugin --save
1. 开启插件
js
// config/plugin.js
exports.websocket = {
enable: true,
package: "egg-websocket-plugin",
};
2. 配置 WebSocket 路由
js
// app/router.js
app.ws.route("/ws", app.controller.home.hello);
3. 配置全局中间件
js
// app/router.js
// 配置 WebSocket 全局中间件
app.ws.use((ctx, next) => {
console.log("websocket 开启");
await next();
console.log("websocket 关闭");
});
4. 配置路由中间件
路由会依次用到 app.use, app.ws.use, 以及 app.ws.router 中配置的中间件
js
// app/router.js
function middleware(ctx, next) {
// console.log('open', ctx.starttime);
return next();
}
// 配置路由中间件
app.ws.route("/ws", middleware, app.controller.chat.connect);
5. 在控制中使用 websocket
websocket 是一个 ws
,可阅读 ws 插件的说明文档或 TypeScript 的定义
js
// app/controller/chat.js
import { Controller } from "egg";
export default class ChatController extends Controller {
// 连接socket
async connect() {
const { ctx, app } = this;
if (!ctx.websocket) {
ctx.throw(400, "非法访问");
}
console.log(`clients: ${app.ws.clients.size}`);
// 监听接收消息和关闭socket
ctx.websocket
.on("message", (msg) => {
console.log("接收消息", msg);
})
.on("close", (code, reason) => {
console.log("websocket 关闭", code, reason);
});
}
}
常用
js
// 广播(发送给所有的人)
app.ws.clients.forEach((client) => {
client.send(msg);
});
// 发送给当前用户
ctx.websocket.send("哈哈哈,链接上了");
// 当前上线人数
app.ws.clients.size;
// 强制当前用户下线
ctx.websocket.close();