WebSocket
ws 模块是 Node 端的一个 WebSocket 协议的实现,该协议允许客户端(一般是浏览器)持久化和服务端的连接. 这种可以持续连接的特性使 得 WebScoket 特别适合用于适合用于游戏或者聊天室等使用场景。
Midway 提供了对 ws 模块的支持和封装,能够简单的创建一个 WebSocket 服务。
安装依赖
在现有项目中安装 WebSocket 的依赖。
$ npm i @midwayjs/ws --save
$ npm i @types/ws --save-dev
目录结构
下面是 WebSocket 项目的基础目录结构,和传统应用类似,我们创建了 socket 目录,用户存放 WebSocket 业务的服务代码。
.
├── package.json
├── src
│ ├── configuration.ts ## 入口配置文件
│ ├── interface.ts
│ └── socket ## ws 服务的文件
│ └── hello.ts
├── test
├── bootstrap.js ## 服务启动入口
└── tsconfig.json
提供 Socket 服务
Midway 通过 @WSController 装饰器定义 WebSocket 服务。
@Provide()
@WSController()
export class HelloSocketController {}
当有客户端连接时,会触发 connection 事件,我们在代码中可以使用 @OnWSConnection() 装饰器来修饰一个方法,当每个客户端第一次连接服务时,将自动调用该方法。
import { WSController, Provide, OnWSConnection, Inject } from '@midwayjs/decorator';
import { Context } from '@midwayjs/ws';
import * as http from 'http';
@Provide()
@WSController()
export class HelloSocketController {
@Inject()
ctx: Context;
@OnWSConnection()
async onConnectionMethod(socket: Context, request: http.IncomingMessage) {
console.log(`namespace / got a connection ${this.ctx.readyState}`);
}
}
信息
这里的 ctx 等价于 WebSocket 实例。