【发布时间】:2022-01-09 19:40:10
【问题描述】:
我是 nodejs 的新手,正在尝试实现 NestJS's CQRS 'recipe'。我有一个Request 范围的服务,QueryBus 注入:
@Injectable({scope: Scope.REQUEST})
export class CustomerService {
constructor(
@Inject(REQUEST) private readonly req: Request,
private readonly queryBus: QueryBus,
) {}
我已经定义了一个处理程序类CustomerHandler 来处理CustomerQuery:
@QueryHandler(CustomerQuery)
export class CustomerHandler implements IQueryHandler<CustomerQuery> {
constructor(
private readonly repository: CustomerRepository,
) {}
async execute(query: CustomerQuery) {
const {response, id, name} = query;
this.repository.getCustomer(response, id, name);
}
但在执行时我收到一条错误消息:
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'getCustomer' of undefined at CustomerHandler.execute
这意味着,如果我没记错的话,存储库注入失败。 (导致语句 this.repository.getCustomer(response, id, name); 的代码失败)
我已在模块CustomerModule 的providers 数组中添加了我的存储库类CustomerRepository:
@Module({
imports: [Logger, CqrsModule],
providers: [CustomerService, ...QueryHandlers, CustomerRepository],
exports: [CustomerService],
})
export class CustomerModule {}
这是我的存储库类,供参考:
@Injectable()
export class CustomerRepository {
constructor(
@Inject(REQUEST) private readonly req: Request,
) {}
我在这里遗漏了什么吗?为什么我的存储库类没有被实例化,如果不是这样,为什么处理程序中的存储库注入失败。任何输入将不胜感激:)
我正在关注的文档:https://docs.nestjs.com/recipes/cqrs
我参考的 Github 示例:https://github.com/kamilmysliwiec/nest-cqrs-example
编辑:
处理程序 (CustomerHandler) 无法执行任何类型的注入。我尝试注入记录器(PinoLogger),这导致了类似的问题。所以,看起来,问题不在于CustomerRepository,而在于CustomerHandler。
更新:
所以基本上,问题在于每个 CqrsModule 提供程序都是 静态范围,这意味着它们不能依赖于请求范围 提供者。一旦将命令处理程序定义为请求范围 提供程序,CommandBus 或 QueryBus 将无法引用它。 这不是问题,而是背后的设计决策 整个模块。
来源:https://github.com/nestjs/cqrs/issues/60#issuecomment-483288297
即@QueryHandler() 不能在请求范围内(来源:评论问题 - NestJS undefined dependencies 并回答相同的 https://stackoverflow.com/a/61916353/10011503)。
而且,这也是open issue。
【问题讨论】:
-
@Injectable({ scope: Scope.REQUEST }) export class CustomerRepository {}docs.nestjs.com/fundamentals/injection-scopes#injection-scopes -
嗨@MicaelLevi,感谢您的建议,我尝试更改范围,但问题仍然存在。
-
尝试在 CustomerHandler 中添加 Injectable Decorator 并将处理程序添加到提供程序?
-
嗨@ShahriarShojib,也尝试使用装饰器,有和没有范围,但仍然导致错误。
-
如果一切都失败了,尝试使用带有或不带有惰性函数的 Inject 装饰器注入它
标签: javascript node.js typescript nestjs cqrs