我尝试实现一个小的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: 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模块的问题,但我不明白它是如何工作的,也不知道如何解决这个问题。
如果有人有主意,我会很感兴趣的。
谢谢你的帮助。
发布于 2020-05-07 04:14:03
Repository
是TypeORM中的抽象类,不能直接实例化。Nest会尽其所能解决这个问题,但最终它会提供一个undefined
,因此,调用createQueryBuilder
会给您带来一个问题。既然您正在使用TypeORM,那么您不使用@nestjs/typeorm
包有什么原因吗?它管理为您创建存储库类,并使事情变得更容易。你不想使用这个包,你可以创建自己的Repository类UserRepository extends Repository
,用合适的元数据和所有的东西来装饰,然后用那个类代替Repository
发布于 2020-05-08 14:20:01
感谢您的信息,我不知道这个现有的包。我会尽力实施你的建议。我是这些技术的新手,我每天都在发现一些新的东西。从三月初开始,我已经学习了HTML,CSS,Javascript,Typescript NestJs和Angular,现在我试图用所有这些技术来实现一个小项目。我认为我的知识中有很多漏洞,我很感谢你的回答给我这些信息。
https://stackoverflow.com/questions/61644355
复制相似问题