首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我不明白注入依赖是如何工作的。有没有人能给我解释清楚

我不明白注入依赖是如何工作的。有没有人能给我解释清楚
EN

Stack Overflow用户
提问于 2020-05-07 04:05:15
回答 2查看 420关注 0票数 0

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

代码语言:javascript
运行
复制
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;
  }

}

我的任务服务如下:

代码语言:javascript
运行
复制
import { LoggerService } from '../../../logger/logger.service';
import { UserService } from '../../providers/user/user.service';
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';

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

  constructor(private _userService: UserService) {}

  @Cron(CronExpression.EVERY_MINUTE)
  async reactiveUsers() {
    this._logger.setMethod(this.reactiveUsers.name);
    this._logger.log(`Reactive blocked users`);
    try {
      await this._userService.reactiveBlockedUsers();
    } catch (error) {
      this._logger.log(error);
    }
  }

  @Cron(CronExpression.EVERY_MINUTE)
  startBatchJobs() {
    this._logger.setMethod(this.startBatchJobs.name);
    this._logger.log(`Start batch job service`);
  }

  triggerNotifications() {}
}

任务模块如下:

代码语言:javascript
运行
复制
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 TypeError: Cannot read property 'createQueryBuilder‘of undefined

Or:(node:13668) UnhandledPromiseRejectionWarning: TypeError:无法在(D:\dev\hammer\hammer-server\dist\src\shared\services\tasks\ (D:\dev\hammer\hammer-server\dist\src\shared\services\tasks\的Repository.createQueryBuilder (D:\dev\hammer\hammer-server\dist\src\shared\providers\user\user.service.js:183:14)的Repository.createQueryBuilder UserService.reactiveBlockedUsers读取未定义的属性‘TasksService.reactiveUsers’tasks.service.js:25:33) at CronJob.fireOnTick (D:\dev\hammer\hammer-server\node_modules\cron\lib\cron.js:562:23) at Timeout.callbackWrapper as _onTimeout at listOnTimeout (内部/timers.js:549:17) at processTimers (内部/timers.js:492:7)(节点:13668) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误是由于在没有catch块的异步函数内部引发,或拒绝未使用.catch()处理的promise造成的。要在未处理的promise rejection上终止节点进程,请使用CLI标志--unhandled-rejections=strict (请参见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝id: 2) (节点:13668) DEP0018 DeprecationWarning:未处理的promise拒绝已弃用。将来,未处理的promise拒绝将使用非零退出代码终止Node.js进程。

当我抑制try catch时。

对我来说,这是一个提供注入到UserService中的Repositiry模块的问题,但我不明白它是如何工作的,也不知道如何解决这个问题。

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

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2020-05-07 04:14:03

Repository是TypeORM中的抽象类,不能直接实例化。Nest会尽其所能解决这个问题,但最终它会提供一个undefined,因此,调用createQueryBuilder会给您带来一个问题。既然您正在使用TypeORM,那么您不使用@nestjs/typeorm包有什么原因吗?它管理为您创建存储库类,并使事情变得更容易。你不想使用这个包,你可以创建自己的Repository类UserRepository extends Repository,用合适的元数据和所有的东西来装饰,然后用那个类代替Repository

票数 1
EN

Stack Overflow用户

发布于 2020-05-08 14:20:01

感谢您的信息,我不知道这个现有的包。我会尽力实施你的建议。我是这些技术的新手,我每天都在发现一些新的东西。从三月初开始,我已经学习了HTML,CSS,Javascript,Typescript NestJs和Angular,现在我试图用所有这些技术来实现一个小项目。我认为我的知识中有很多漏洞,我很感谢你的回答给我这些信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61644355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档