如何使用cqrs模块在nestjs中进行查询?

yus*_*enn 2 cqrs node.js typescript nestjs

我在我的应用程序后端使用nestjs。我使用cqrs模块https://github.com/nestjs/cqrs,我读到cqrs有一个命令来写入操作和查询来读取操作,但是nestjs文档(https://docs .nestjs.com/recipes/cqrs)只有一个命令示例,那么如何在nestjs中实现查询?

Jas*_*rey 5

查询由QueryHandler处理。他们实现IQueryHandler这要求你有一个异步execute函数。Observable我个人的偏好是从控制器执行的查询处理程序返回一个,这在 NestJS 应用程序中得到完全支持

这是一个查询示例:

class GetSomeStuff {
  constructor(
    readonly id: string;
  ) {}
}
Run Code Online (Sandbox Code Playgroud)

端点:

import { QueryBus } from '@nestjs/cqrs';

class SomeController {
  constructor(private queryBus: QueryBus) {}

  @Get('some-stuff')
  getSomeStuff() {
    return this.queryBus.execute(new GetSomeStuff('foo_id'));
  }
}

Run Code Online (Sandbox Code Playgroud)

查询处理程序:

import { GetSomeStuff } from '@app/shared/util-queries';
import { SharedStuffDataService } from '@app/shared/stuff/data-access'
import { GetSomeStuffDto } from '@app/shared/util-models';
import { IQueryHandler, QueryHandler } from '@nestjs/cqrs';
import { from } from 'rxjs';
import { map } from 'rxjs/operators';

@QueryHandler(GetSomeStuff)
export class GetSomeStuffHandler implements IQueryHandler<GetSomeStuff> {
  constructor(
    private readonly dataService: SharedStuffDataService,
  ) {}

  async execute(query: GetSomeStuff) {
    const stuffRepo = this.dataService.connectToReadModel();

    return from(stuffRepo.getOneById(query.id)).pipe(
      map(stuff => new GetSomeStuffDto(stuff))
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

Query Handlers放置在providers模块的部分中,如下所示:

@Module({
  imports: [
    CqrsModule,
    SharedStuffDataModule,
  ],
  providers: [ GetSomeStuffHandler ],
})
export class QueriesModule {}
Run Code Online (Sandbox Code Playgroud)