我不明白注入依赖性是如何工作的,有谁能给我解释清楚吗?有没有人可以给我解释清楚

问题描述 投票:0回答:1

我试图实现一个小的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 { 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() {}
}

任务模块如下。

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] 06052020 19:57:00.024 [TasksService.reactiveUsers] TypeError: 不能读取未定义的属性'createQueryBuilder'。

或者 :(node:13668) UnhandledPromiseRejectionWarning: TypeError.无法读取Repository.createQueryBuilder的未定义属性'createQueryBuilder'。在Repository.createQueryBuilder(D:\dev\hammer\hammer-server/node_modules\typeorm\repository/Repository.js:17:29)无法读取未定义的属性 "createQueryBuilder"。 reactiveBlockedUsers(D:dev/hammer/server/dist/src/shared/providers/user/user.service.js:183:14)在TasksService.reactiveUsers(D:dev/hammer/server/dist/src/shared/services/tasks/tasks. service.js:25:33)在CronJob.fireOnTick(D:\devhammer\hammer/server/node_modules\cron/libcron.js:562:23)在Timeout.callbackWrapper[as _onTimeout](D:\devhammer\hammer/server/node_modules\cron/libcron. js:629:10) at listOnTimeout (internaltimers.js:549:17) at processTimers (internaltimers.js:492:7)(node:13668) UnhandledPromiseRejectionWarning: Unhandled promise rejection。这个错误起源于在没有 catch 块的异步函数里面抛出,或者拒绝一个没有用 .catch() 处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用 CLI 标志。--unhandled-rejections=strict (见 https:/nodejs.orgapicli.html#cli_unhandled_rejections_mode。). (rejection id: 2)(node:13668) [DEP0018] DeprecationWarning: 未处理的承诺拒绝已被废弃。今后,未处理的承诺拒绝将以一个非零的退出代码终止Node.js进程。

当我抑制try catch时。

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

如果有人有一个想法,我将是感兴趣的。

谢谢你的帮助。

typescript nestjs code-injection
1个回答
1
投票

Repository 是TypeORM中的一个抽象类,不能直接实例化。Nest围绕这一点做了它能做的事情,但最终它将提供一个新的类。undefined 因此,称 createQueryBuilder 会给你一个问题。当你使用TypeORM时,有一个原因是你没有使用 @nestjs/typeorm 包?它为你管理创建版本库类,让事情变得更简单。如果你不喜欢使用这个包,你可以随时创建你自己的版本库类。UserRepository extends Repository 饰以适当的元数据和所有,然后使用该类而非 Repository


0
投票

谢谢你提供的信息,我不知道这个现有的包。我将尝试实施您的建议。我在这些技术方面是个新手,我每天都在发现新的东西。从3月初开始,我学习了HTML、CSS、Javascript、Typescript、NestJs和Angular,现在我尝试用这些技术实现一个小项目。我觉得我的知识有很多漏洞,我很感谢你的回答,给我这些信息。

© www.soinside.com 2019 - 2024. All rights reserved.