我不明白注入依赖是如何工作的。有没有人可以清楚地解释我
Posted
技术标签:
【中文标题】我不明白注入依赖是如何工作的。有没有人可以清楚地解释我【英文标题】:I don't understand how works injection dependency. Is there somebody which can explain me clearly 【发布时间】:2020-08-21 22:56:58 【问题描述】:我尝试实现一个小的 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] 06/05/2020 19:57:00.024 [TasksService.reactiveUsers] TypeError:无法读取未定义的属性“createQueryBuilder”
或者:
(节点:13668)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“createQueryBuilder”
在 Repository.createQueryBuilder (D:\dev\hammer\hammer-server\node_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_modules\cron\lib\cron.js:562:23)
在 Timeout.callbackWrapper [as _onTimeout] (D:\dev\hammer\hammer-server\node_modules\cron\lib\cron.js:629:10)
在 listOnTimeout (internal/timers.js:549:17)
在 processTimers (internal/timers.js:492:7)
(节点:13668)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict
(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:2)
(节点:13668)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
当我抑制 try catch 时。
对我来说,提供在 UserService 中注入的 Repositiry 模块是一个问题,但我不明白它是如何工作的以及如何解决这个问题。
如果有人有想法,我会很感兴趣。
感谢您的帮助。
【问题讨论】:
您的标题听起来与此问题完全相同:***.com/questions/130794/what-is-dependency-injection,但您的问题本身似乎与您的特定代码中的特定错误有关。如果标题更具体地针对您的问题,您的问题将更有可能得到答案:) 【参考方案1】:Repository
是TypeORM中的抽象类,不能直接实例化。 Nest 会尽其所能解决这个问题,但最终它会提供一个undefined
,因此,调用createQueryBuilder
会给您带来问题。当您使用 TypeORM 时,您是否有理由不使用 @nestjs/typeorm
包?它管理为您创建存储库类并使事情变得更容易。你对不使用这个包很生气,你总是可以创建你自己的 Repository 类UserRepository extends Repository
用适当的元数据和所有装饰,然后使用那个类而不是Repository
【讨论】:
【参考方案2】:感谢您提供有关此现有软件包的信息。我会努力执行你的提议。我是这些技术的新手,我每天都会发现一些新东西。从三月初开始,我学习了 HTML、CSS、javascript、Typescript NestJs 和 Angular,现在我尝试用所有这些技术来实现一个小项目。我认为我的知识有很多漏洞,我很感激你的回答给我这些信息。
【讨论】:
您可以查看这部分文档docs.nestjs.com/techniques/database#typeorm-integration以上是关于我不明白注入依赖是如何工作的。有没有人可以清楚地解释我的主要内容,如果未能解决你的问题,请参考以下文章
Python BUG 或者我不明白编码是如何工作的? len、find 和 re.search 在没有空的、成功的 subprocess.communicate() 执行结果的情况下啥也不做