带有简单主题的 NestJS SSE

问题描述 投票:0回答:0

我正在尝试使用 NestJS 中的服务器发送事件创建通知。 我想做的是暴露 2 个端点

/room
-> POST方法创建房间
/room
-> SSE 在添加新房间时发送通知。

在客房服务中, 我有一个简单的数组,用于保存用户创建的房间。 还有一个 rxjs 主题,它发布了一个新添加的房间。

// RoomsService.ts

@Injectable()
export class RoomsService {
  private rooms: Room[] = [];
  private _rooms$: Subject<Room> = new Subject<Room>();

  public get rooms$(): Observable<Room> {
    return this._rooms$.asObservable();
  }

  createRoom(roomDto: CreateRoomDto): Room {
    const room: Room = {
      title: roomDto.title,
      creator: {
        id: v4(),
        name: roomDto.creator,
      },
      createdAt: new Date(Date.now()),
      updatedAt: new Date(Date.now()),
      id: v4(),
    };

    this.rooms.push(room);
    this._rooms$.next(room);
    return room;
  }

  getRoom(id: string): Room | undefined {
    console.log(this.rooms);
    return this.rooms.find((room) => room.id === id);
  }
}

然后在 RoomsController 中

// RoomsController.ts

@Controller('rooms')
export class RoomsController {
  constructor(
    private roomsService: RoomsService,
    private eventEmitter: EventEmitter2,
  ) {}
  @Post()
  createRoom(@Body() body: CreateRoomDto): Room {
    return this.roomsService.createRoom(body);
  }

  @Get(':id')
  getRoom(@Param('id') id: string): Room {
    const room = this.roomsService.getRoom(id);
    if (!room) {
      throw new HttpException('Room Not Found', HttpStatus.NOT_FOUND);
    }

    return room;
  }

  @Sse('/notif')
  notif(): Observable<Room> {
    return this.roomsService.rooms$.pipe(map((room) => room));
  }
}

但是由于某些原因,SSE 没有将新创建的房间发布给客户端。 POST 端点工作正常,但未发出主题的下一个值。 可能是什么问题?

PS:我能够使用 EventEmitter 来实现它。只是想知道这是否可以在不使用 EventEmitter 而仅使用 Subject 的情况下完成。

nestjs server-sent-events nestjs-sse
© www.soinside.com 2019 - 2024. All rights reserved.