【问题标题】:NestJs + TypeORM injected repository becomes undefinedNestJs + TypeORM 注入的存储库变得未定义
【发布时间】:2020-04-19 16:47:08
【问题描述】:

我有一个从外部系统获取Requisition 数据的代码,如下所示:

init() {
  const requisitionData = this.loginMb().pipe(
    map(response => response.data.token),
    switchMap(loginData => this.getRequisitions(loginData)),
    map(response => response.data),
  );
  requisitionData.subscribe(this.processData);
}

这里是processData()

processData(response: any) {
  const requisitions = response.content.data;
  for (const p of requisitions) {
    const req = new Requisition(); // Requisition is the TypeORM entity
    req.title = p.title;
    req.reference = p.reference;
    // other fields 

    this.repo.save(requisition);
  }

这是构造函数

@Injectable()
export class RequisitionSync {
  constructor(
    @InjectRepository(Requisition) private readonly repo: Repository<Requisition>,
    private readonly httpService: HttpService,
  ) {}

问题在processData()内部,this.repo变成undefined。如果我在init() 里面做console.log(this.repo),它就不会是undefined

【问题讨论】:

  • 我相信这是因为 subscribe 的词法 this 与类本身不同。如果您只是在 processData 方法中使用 console.log(this) 会发生什么?
  • 它输出SafeSubscriber { ... ,这是全部内容:pastebin.com/s1zPFBfh
  • 和我想的一样,subscribe 的 this 与 class 不同。
  • 一个问题,processData 不应该是async 函数吗?
  • 我其实也不确定。

标签: typescript nestjs typeorm


【解决方案1】:

由于this 的词法绑定在类中与在订阅方法中不同,因此您需要找到其他方法来管理该函数。如果可能的话,我建议再使用一个mapmergeMap 并在其中运行你的this.processData,然后订阅让事件按照它们的意愿发生,本质上将调用链创建为

init() {
  const requisitionData = this.loginMb().pipe(
    map(response => response.data.token),
    switchMap(loginData => this.getRequisitions(loginData)),
    map(response => response.data),
    map(this.processData), // or mergeMap(data => this.processData(data)), your choice
  );
  requisitionData.subscribe();
}

【讨论】:

  • 这成功了!我使用了map() 方式,因为mergeMap 似乎在期待回报
  • 完美,我会更新答案。不确定您的确切用例是什么
猜你喜欢
  • 2021-01-07
  • 2019-07-05
  • 2021-11-21
  • 2021-07-15
  • 2020-06-06
  • 1970-01-01
  • 2020-07-02
  • 2021-06-07
  • 2022-01-17
相关资源
最近更新 更多