我正在尝试使用 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 的情况下完成。