Данные события в Nest
Слушателю мало факта срабатывания: нужен заголовок новой строки или другие поля, которые сервис только что положил в память. Без передачи данных пришлось бы снова искать строку по всему массиву.
При публикации вторым аргументом передают объект. Слушатель получает его параметром метода реакции и читает нужные поля, не обращаясь к сервису напрямую.
Покажем на примере постов:
import { Injectable } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
@Injectable()
export class PostService {
posts: { title: string }[] = [];
eventEmitter: EventEmitter2;
constructor(eventEmitter: EventEmitter2) {
this.eventEmitter = eventEmitter;
}
create(title: string): { title: string } {
const post = { title };
this.posts.push(post);
this.eventEmitter.emit('post.created', post);
return post;
}
}
Слушатель сохранит заголовок из переданного объекта в поле класса:
import { Injectable } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';
@Injectable()
export class PostCreatedListener {
lastTitle = '';
@OnEvent('post.created')
handlePostCreated(payload: { title: string }) {
this.lastTitle = payload.title;
}
}
Контроллер по-прежнему вызывает сохранение из тела запроса:
import { Body, Controller, Post } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller('posts')
export class PostController {
postService: PostService;
constructor(postService: PostService) {
this.postService = postService;
}
@Post()
create(@Body('title') title: string) {
return this.postService.create(title);
}
}
Передайте из WorkerService
в сигнал объект с данными работника,
а WorkerCreatedListener
запишет их в поле класса.