Typescript 我不知道';我不理解注入依赖是如何工作的。有人能给我解释清楚吗

Typescript 我不知道';我不理解注入依赖是如何工作的。有人能给我解释清楚吗,typescript,nestjs,code-injection,Typescript,Nestjs,Code Injection,我尝试实现一个小的NestJS应用程序,我想在其中集成一个任务调度器。此调度器的首要任务之一是更新数据库中的数据。此任务服务将使用UserService,如下所示: import { Injectable, Inject, UnprocessableEntityException, HttpStatus, } from '@nestjs/common'; import { Repository } from 'typeorm'; import * as bcrypt from '

我尝试实现一个小的NestJS应用程序,我想在其中集成一个任务调度器。此调度器的首要任务之一是更新数据库中的数据。此任务服务将使用UserService,如下所示:

import {
  Injectable,
  Inject,
  UnprocessableEntityException,
  HttpStatus,
} from '@nestjs/common';
import { Repository } from 'typeorm';
import * as bcrypt from 'bcryptjs';
import { User, UserStatus } from './user.entity';
import { LoggerService } from '../../../logger/logger.service';
import { HammerErrors } from 'src/error/hammer.errors';
import * as Config from '../../../config/global.env';

@Injectable()
export class UserService {
  private readonly _logger = new LoggerService(UserService.name);

  constructor(
    @Inject('USER_REPOSITORY')
    private _userRepository: Repository<User>,
  ) {}
  ....
  async reactiveBlockedUsers() {
    this._logger.setMethod(this.reactiveBlockedUsers.name);
    this._logger.log(`Update blocked users`);
    await this._userRepository
      .createQueryBuilder('hm_users')
      .update(User)
      .set({
        nextValidDate: null,
      })
      .where(
        `hm_users.nextValidDate IS NOT NULL hm_users.nextValidDate < utc_timestamp()`,
      )
      .execute();
    return null;
  }
任务模块如下所示:

import { Module } from '@nestjs/common';
import { TasksService } from './tasks.service';
import { UserService } from 'src/shared/providers/user/user.service';
import { Repository } from 'typeorm';

@Module({
  providers: [
    TasksService,
    UserService,
    {
      provide: 'USER_REPOSITORY',
      useClass: Repository,
    },
  ],
})
export class TasksModule {}
当我发现该过程工作时,我有以下陷阱: [INFO]06/05/2020 19:57:00.024[TasksService.reactiveUsers]类型错误:无法读取未定义的属性“createQueryBuilder”

或: (节点:13668)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“createQueryBuilder” 位于Repository.createQueryBuilder(D:\dev\hammer\hammer server\node\u modules\typeorm\Repository\Repository.js:17:29) 位于UserService.reactiveBlockedUsers(D:\dev\hammer\hammer server\dist\src\shared\providers\user\user.service.js:183:14) 位于TasksService.reactiveUsers(D:\dev\hammer\hammer server\dist\src\shared\services\tasks\tasks.service.js:25:33) 在CronJob.fireOnTick(D:\dev\hammer\hammer server\node\u modules\cron\lib\cron.js:562:23) Timeout.callbackWrapper[as\u onTimeout](D:\dev\hammer\hammer server\node\u modules\cron\lib\cron.js:629:10) 在listOnTimeout(internal/timers.js:549:17) 在processTimers(internal/timers.js:492:7) (节点:13668)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志
--unhandled rejections=strict
(请参阅)。(拒绝id:2) (节点:13668)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程

当我抑制尝试捕捉时

对我来说,这是一个提供存储模块的问题,该模块被注入到UserService中,但我不明白它是如何工作的,以及如何解决这个问题

如果有人有主意,我会感兴趣的


感谢您的帮助。

存储库
是TypeForm中的抽象类,不能直接实例化。Nest尽其所能解决这一问题,但最终它将提供一个
未定义的
,因此,调用
createQueryBuilder
将给您带来一个问题。当您使用TypeORM时,有没有理由不使用
@nestjs/TypeORM
包?它管理着为您创建存储库类,并使事情变得更加简单。如果您打算不使用该软件包,您可以始终创建自己的存储库类
UserRepository extensed Repository
,并使用适当的元数据和所有内容,然后使用该类而不是
Repository
感谢您提供了我不知道的有关此现有软件包的信息。我将努力实施你的建议。我是这些技术的新手,每天都会发现一些新的东西。从三月初开始,我学习了HTML、CSS、Javascript、Typescript、NestJs和Angular,现在我尝试用所有这些技术实现一个小项目。我认为我的知识有很多漏洞,我很感激你的回答能给我这些信息。

你的题目听起来像是这个问题的翻版:,但你的问题本身似乎是关于你特定代码中的特定错误。如果标题更具体地针对您的问题,您的问题更有可能得到答案:)您可以查看文档的这一部分
import { Module } from '@nestjs/common';
import { TasksService } from './tasks.service';
import { UserService } from 'src/shared/providers/user/user.service';
import { Repository } from 'typeorm';

@Module({
  providers: [
    TasksService,
    UserService,
    {
      provide: 'USER_REPOSITORY',
      useClass: Repository,
    },
  ],
})
export class TasksModule {}