🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 服务器端事件发送 服务器端事件发送(`SSE`)是一个服务器推送技术,用来使客户端在`HTTP`连接下自动接收服务器更新消息。每个消息以一个由一对新行符号作为结束的文字块发送(参见[这里](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events))。 ### 使用 要在路径中使能服务器端事件发送(路径在控制器类中注册),用`@Sse()`装饰器注释该方法处理程序。 ```TypeScript @Sse('sse') sse(): Observable<MessageEvent> { return interval(1000).pipe(map((_) => ({ data: { hello: 'world' } }))); } ``` ?> `@Sse()`装饰器从`@nestjs/common`中导入,`Observable, interval, 和 map`从`rxjs`中导入。 !> 服务器端事件发送路径必须返回`Observable`流。 在上述示例中,我们定义了一个命名的`sse`来生成实时更新,这些事件可以通过 [EventSource API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) 监听。 `sse`方法返回一个`Observable`并发送多个`MessageEvent`(在本例中,它每秒发射一个新的`MessageEvent`)。`MessageEvent`应该与下列接口相匹配。 ```TypeScript export interface MessageEvent { data: string | object; id?: string; type?: string; retry?: number; } ``` 这样,我们可以在客户端创建一个`EventSource`类的实例应用。并将`/sse`路径(这和我们传递给`@Sse()`装饰其中的路径字符串一致)作为其构造函数参数。 `EventSource`实例打开一个和 HTTP 服务器的持久性连接,它以`text/event-stream`格式发送事件。连接在调用`EventSource.close()`方法前始终保持。 一旦连接打开,从服务器传来的消息将以事件格式传递给你的代码。如果在传入消息中有事件字段,和事件字段相同的字段将会被触发。如果当前没有该事件字段,则触发一个一般的`message`事件(参见[这里](https://developer.mozilla.org/en-US/docs/Web/API/EventSource))。 ```TypeScript const eventSource = new EventSource('/sse'); eventSource.onmessage = ({ data }) => { console.log('New message', JSON.parse(data)); }; ``` [这里](https://github.com/nestjs/nest/tree/master/sample/28-sse)有一个可用的例子。