Typescript 我不知道';我不理解注入依赖是如何工作的。有人能给我解释清楚吗
我尝试实现一个小的NestJS应用程序,我想在其中集成一个任务调度器。此调度器的首要任务之一是更新数据库中的数据。此任务服务将使用UserService,如下所示: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 '
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 {}