Module OnModuleInit 方法中如何使用service
来源:9-5 前端菜单列表查询和渲染开发

weixin_慕九州9483516
2024-03-07
需求:
在初始化user module完成后,我希望创建系统默认用户(root)
我的实现:
export class UserModule implements OnModuleInit {
constructor(private readonly otherService: UserService) {}
onModuleInit() {
// 在模块初始化后执行的逻辑,这个不会执行
console.log('Module initialized!')
this.otherService.createDefaultUser()
}
当构造函数不传参的时候,是可以调用onModuleInit 里面的打印的,上面的传参的就不好使
export class UserModule implements OnModuleInit {
constructor() {}
onModuleInit() {
// 在模块初始化后执行的逻辑,这个会执行
console.log('Module initialized!')
}
期望
:创建root用户的逻辑在service中,期望能在onModuleInit 中调用创建root用户的逻辑,来达到应用初始化的时候执行一次该逻辑
备注:
async createDefaultUser(): Promise<void> {
const res = await this.UserModel.findOne({ phone: SUPER_ADMIN_PHONE })
if (!res) {
const defaultUser = {
username: 'superAdmin',
password: md5(Buffer.from('Passw0rd2024!').toString('base64')),
phone: SUPER_ADMIN_PHONE,
userId: uuidv4()
}
await this.UserModel.create(defaultUser)
}
}
写回答
2回答
-
慕九州同学你好,OnModuleInit 仅会在 Controller 初始化的时候被调用一次,这一点可以参考官方文档:
也就是说你启动项目初始化 Controller 后 OnModuleInit 就会被调用,之后访问接口时 OnModuleInit 不会被调用,这和你的构造函数是否有入参无关,我在本地也测试过了,在启动 web 服务后就会调用 OnModuleInit 并打印出 service 信息,你可以参考我的实现:
export class AuthController implements OnModuleInit { constructor( private authService: AuthService, ) {} onModuleInit() { console.log('onModuleInit', this.authService); } }
启动项目后会打印出:
onModuleInit AuthService { userService: UserService { usersRepository: Repository { target: [class User], manager: [EntityManager], queryRunner: undefined } }, jwtService: JwtService { options: { global: true, secret: 'abcdefg', signOptions: [Object] }, logger: Logger { context: 'JwtService', options: {} } } }
注意:如果你是在项目启动过程中加入 onModuleInit 则会在第一次调用接口时打印这些信息,所以加入 onModuleInit 后建议重启项目再试
012024-03-14 -
扬_灵
2024-03-10
同学你好,可以参考一下这篇文档https://www.cnblogs.com/xiaozhumaopao/p/15439359.html
00
相似问题