NestJS Server-Sent事件

2023-09-08 18:14 更新

Server-Sent 事件 (SSE) 是一種服務(wù)器推送技術(shù),使客戶端能夠通過 HTTP 連接從服務(wù)器接收自動更新。 每個通知都作為由一對換行符終止的文本塊發(fā)送。

使用

要在路由(在控制器類中注冊的路由)上啟用 Server-Sent 事件,請使用 @Sse() 裝飾器注解方法處理程序。

@Sse('sse')
sse(): Observable<MessageEvent> {
  return interval(1000).pipe(map((_) => ({ data: { hello: 'world' } })));
}
提示 :@Sse() 裝飾器和 MessageEvent 接口是從 @nestjs/common 導(dǎo)入的,而 Observable、interval 和 map 是從 rxjs 包中導(dǎo)入的。
警告 : Server-Sent 事件路由必須返回一個 Observable 流。

在上面的示例中,我們定義了一個名為 sse 的路由,它將允許我們發(fā)送實時更新。 可以使用 EventSource API 監(jiān)聽這些事件。

sse 方法返回一個發(fā)出多個 MessageEvent 的 Observable(在此示例中,它每秒發(fā)出一個新的 MessageEvent)。 MessageEvent 對象應(yīng)遵循以下接口以匹配規(guī)范:

export interface MessageEvent {
  data: string | object;
  id?: string;
  type?: string;
  retry?: number;
}

有了這個,我們現(xiàn)在可以在我們的客戶端應(yīng)用程序中創(chuàng)建 EventSource 類的實例,將 /sse 路由(它與我們傳遞給上面的 @Sse() 裝飾器的端點匹配)作為構(gòu)造函數(shù)參數(shù)傳遞。

EventSource 實例打開與 HTTP 服務(wù)器的持久連接,該服務(wù)器以文本/事件流格式發(fā)送事件。 連接保持打開狀態(tài),直到通過調(diào)用 EventSource.close() 關(guān)閉。

一旦打開連接,來自服務(wù)器的傳入消息就會以事件的形式傳遞給我們的代碼。 如果傳入消息中有事件字段,則觸發(fā)的事件與事件字段值相同。 如果不存在事件字段,則觸發(fā)通用消息事件。

const eventSource = new EventSource('/sse');
eventSource.onmessage = ({ data }) => {
  console.log('New message', JSON.parse(data));
};


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號