Skip to content
关注公众号,获取新课通知

安装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();