Запрос в Nest
Клиенту нужен только список строк из памяти, но тот же сервис, что и для записи, легко смешать чтение с изменением массива. Отдельный адрес не должен тянуть за собой лишний код сохранения.
Запрос
- класс без побочных эффектов,
который просит данные.
Сервис создаёт такой объект
и передаёт его QueryBus,
а Nest направляет его
обработчику запроса.
Класс может расширять
Query из пакета
@nestjs/cqrs,
если нужно зафиксировать
тип ответа.
Покажем на примере постов:
import { Query } from '@nestjs/cqrs';
export class GetPostsQuery extends Query<
{ title: string }[]
> {
constructor() {
super();
}
}
Сервис получает
QueryBus
и передаёт ей запрос
при чтении списка:
import { Injectable } from '@nestjs/common';
import { CommandBus, QueryBus } from '@nestjs/cqrs';
import { CreatePostCommand } from './create-post.command.js';
import { GetPostsQuery } from './get-posts.query.js';
@Injectable()
export class PostService {
commandBus: CommandBus;
queryBus: QueryBus;
constructor(commandBus: CommandBus, queryBus: QueryBus) {
this.commandBus = commandBus;
this.queryBus = queryBus;
}
async create(title: string) {
return this.commandBus.execute(
new CreatePostCommand(title),
);
}
async findAll() {
return this.queryBus.execute(new GetPostsQuery());
}
}
Контроллер отдаёт список через сервис:
import { Body, Controller, Get, Post } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller('posts')
export class PostController {
postService: PostService;
constructor(postService: PostService) {
this.postService = postService;
}
@Get()
findAll() {
return this.postService.findAll();
}
@Post()
create(@Body('title') title: string) {
return this.postService.create(title);
}
}
Опишите GetWorkersQuery
и отправляйте его из
WorkerService
через QueryBus
на странице списка работников.