目录
服务器发送的事件
服务器发送事件(Server-Sent Events,SSE)是一种服务器推送技术, 允许客户端通过 HTTP 连接从服务器接收自动更新。 每个通知都作为一块以一对换行符结尾的文本块发送 (在此了解更多)。
用法
要在路由上启用服务器发送事件(在控制器类中注册的路由),请使用 @Sse()
装饰器注释方法处理程序。
@Sse('sse')
sse(): Observable<MessageEvent> {
return interval(1000).pipe(map((_) => ({ data: { hello: 'world' } })));
}
note
@Sse() 装饰器和 MessageEvent
接口从 @nestjs/common 导入,
而 Observable
、interval
和 map
从 rxjs
包中导入。
warning
服务器发送事件路由必须返回一个 Observable
流。
在上面的示例中,我们定义了一个名为 sse
的路由,它允许我们传播实时更新。
可以使用 EventSource API 监听这些事件。
sse
方法返回一个 Observable
,它会发出多个 MessageEvent
(在此示例中,
它每秒发出一个新的 MessageEvent
)。MessageEvent
对象应该符合以下接口以匹配规范:
export interface MessageEvent {
data: string | object;
id?: string;
type?: string;
retry?: number;
}
有了这个设置,我们现在可以在客户端应用程序中创建 EventSource
类的实例,
将 /sse
路由(与我们在 @Sse() 装饰器中传递的端点匹配)作为构造函数参数传递。
EventSource
实例会打开到 HTTP 服务器的持久连接,以 text/event-stream
格式发送事件。
连接保持打开状态,直到调用 EventSource.close()
关闭为止。
一旦连接打开,来自服务器的传入消息将以事件的形式传递给您的代码。
如果传入消息中存在事件字段,则触发的事件与事件字段值相同。
如果不存在事件字段,则触发通用message
事件
(来源)。
const eventSource = new EventSource('/sse');
eventSource.onmessage = ({ data }) => {
console.log('New message', JSON.parse(data));
};
示例
这里有一个可运行的示例。