gpt4 book ai didi

node.js - NestJS - 无法将服务注入(inject)订阅者

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:51 25 4
gpt4 key购买 nike

我有一个 NestJS 订阅者来监听任何创建、更新或删除事件 (TypeORM)。当这些事件之一被触发时,我想使用注入(inject)的服务来创建一个新的修订条目。

但是,我似乎无法将依赖项加载到订阅者内部,并且服务返回为未定义

关键文件:

  • EntityModificationSubscriber(订阅者)
  • RevisionEntity(实体)

app.module.ts

@Module({
imports: [
HttpModule,
TypeOrmModule.forRoot({
type: (process.env.DB_TYPE as any) || 'postgres',
host: process.env.DB_HOST || '127.0.0.1',
port: (process.env.DB_PORT as any) || 5432,
username: process.env.DB_USER || 'root',
password: process.env.DB_PASS || '',
database: process.env.DB_NAME || 'test',
entities: [join(__dirname, '**/**.entity{.ts,.js}')],
synchronize: true,
logging: 'all',
logger: 'advanced-console',
subscribers: [EntityModificationSubscriber],
}),
TypeOrmModule.forFeature([
RevisionEntity,
]),
TerminusModule.forRootAsync({
// Inject the TypeOrmHealthIndicator provided by nestjs/terminus
inject: [TypeOrmHealthIndicator, MicroserviceHealthIndicator],
useFactory: (db, msg) => getTerminusOptions(db, msg),
}),
GraphQLModule.forRoot({
debug: true,
playground: true,
typePaths: ['./**/*.graphql'],
}),
],
controllers: [AppController],
providers: [
RevisionService,
EntityModificationSubscriber,
],
})

entity_modification_subscriber.ts

import {EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, UpdateEvent} from 'typeorm';
import {RevisionEntity, RevisonEntityStatus} from '../entities/revison.entity';
import {RevisionService} from '../services/revisions.service';
import {Injectable} from '@nestjs/common';

@Injectable()
@EventSubscriber()
export class EntityModificationSubscriber implements EntitySubscriberInterface {

constructor(private revisionService: RevisionService) {
}

// tslint:disable-next-line:no-empty
afterInsert(event: InsertEvent<any>): Promise<any> | void {
const revision = new RevisionEntity();

revision.action = RevisonEntityStatus.Created;
}

afterUpdate(event: UpdateEvent<any>): Promise<any> | void {
}

// tslint:disable-next-line:no-empty
afterRemove(event: RemoveEvent<any>) {
// this.revisionService.createRevisionEntry(revision);
}
}

最佳答案

我发现使用 NestJS 将依赖项注入(inject)订阅者的唯一方法是不在 TypeORM 配置中注册该订阅者。我手动将其订阅到订阅者构造函数上的 TypeORM 连接中。

import { EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, UpdateEvent, Connection } from 'typeorm';
import { RevisionEntity, RevisonEntityStatus } from '../entities/revison.entity';
import { RevisionService } from '../services/revisions.service';
import { Injectable } from '@nestjs/common';

@Injectable()
@EventSubscriber()
export class EntityModificationSubscriber implements EntitySubscriberInterface {

constructor(private readonly connection: Connection, private readonly revisionService: RevisionService) {
connection.subscribers.push(this); // <---- THIS
}

// tslint:disable-next-line:no-empty
afterInsert(event: InsertEvent<any>): Promise<any> | void {
const revision = new RevisionEntity();

revision.action = RevisonEntityStatus.Created;

//this.revisionService <- should be working!
}

afterUpdate(event: UpdateEvent<any>): Promise<any> | void {
}

// tslint:disable-next-line:no-empty
afterRemove(event: RemoveEvent<any>) {
// this.revisionService.createRevisionEntry(revision);
}
}

然后在你的app.module中对TypeORM模块进行配置(TypeOrmModule.forRoot)。删除该行:

subscribers: [EntityModificationSubscriber],

它解决了我的问题,希望对其他人有帮助。您可以在一些 NestJS 问题/拉取请求中找到相关讨论。

https://github.com/nestjs/typeorm/issues/85

https://github.com/nestjs/typeorm/pull/27

关于node.js - NestJS - 无法将服务注入(inject)订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58918644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com