服务器范围事件101
#javascript #node #nestjs #sse

服务器范围事件(SSE)是客户端和服务器之间的单向通信。客户使用EventSource API启动与服务器的连接。前面提到的API还可以收听服务器中的事件,收听错误并关闭连接。

const eventSource = new EventSource(url);

eventSource.onmessage = ({ data }) => {
  const eventData = JSON.parse(data);
  // handling the data from the server
};

eventSource.onerror = () => {
  // error handling
};

eventSource.close();

一旦客户端建立客户端服务器连接,服务器可以以text/event-stream格式将事件发送给客户端。服务器可以通过查询参数过滤客户端,并仅发送适当的事件。在下面的示例中,Nestjs服务器仅将事件发送到由其电子邮件地址区分的特定客户端。

import { Controller, Query, Sse } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { Observable, Subject } from 'rxjs';
import { map } from 'rxjs/operators';
import { MessageEvent, MessageEventData } from './message-event.interface';
import { SseQueryDto } from './sse-query.dto';

@Controller()
export class AppController {
  constructor(private readonly eventService: EventEmitter2) {}

  @Sse('sse')
  sse(@Query() sseQuery: SseQueryDto): Observable<MessageEvent> {
    const subject$ = new Subject();

    this.eventService.on(FILTER_VERIFIED, data => {
      if (sseQuery.email !== data.email) return;

      subject$.next({ isVerifiedFilter: data.isVerified });
    });

    return subject$.pipe(
      map((data: MessageEventData): MessageEvent => ({ data })),
    );
  }
  // ...
}

发射上述事件以下方式完成。

const filterVerifiedEvent = new FilterVerifiedEvent();
filterVerifiedEvent.email = user.email;
filterVerifiedEvent.isVerified = true;
this.eventService.emit(FILTER_VERIFIED, filterVerifiedEvent);