我试图实现一个小的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中,但我不明白如何工作,如何解决这个问题。
如果有人有一个想法,我将是感兴趣的。
谢谢你的帮助。
Repository
是TypeORM中的一个抽象类,不能直接实例化。Nest围绕这一点做了它能做的事情,但最终它将提供一个新的类。undefined
因此,称 createQueryBuilder
会给你一个问题。当你使用TypeORM时,有一个原因是你没有使用 @nestjs/typeorm
包?它为你管理创建版本库类,让事情变得更简单。如果你不喜欢使用这个包,你可以随时创建你自己的版本库类。UserRepository extends Repository
饰以适当的元数据和所有,然后使用该类而非 Repository
谢谢你提供的信息,我不知道这个现有的包。我将尝试实施您的建议。我在这些技术方面是个新手,我每天都在发现新的东西。从3月初开始,我学习了HTML、CSS、Javascript、Typescript、NestJs和Angular,现在我尝试用这些技术实现一个小项目。我觉得我的知识有很多漏洞,我很感谢你的回答,给我这些信息。