请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Module OnModuleInit 方法中如何使用service

需求:

在初始化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 初始化的时候被调用一次,这一点可以参考官方文档:

https://img1.sycdn.imooc.com/szimg/65f0810e09bfed9813660338.jpg

也就是说你启动项目初始化 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 后建议重启项目再试

0 回复 有任何疑惑可以回复我~
  • 感谢老师的答复。首先您的回复是对的。我实际的应用场景比我提问的要更复杂点,因为有使用到一个全局的模块中的service
    https://github.com/luchaoqun123/muke   中有我的demo
    下载项目解压后,npm install
    然后运行项目,user.service.ts  问题描述写在注释里了
    回复 有任何疑惑可以回复我~ 2024-03-14 09:35:52
扬_灵 2024-03-10 19:16:52

同学你好,可以参考一下这篇文档https://www.cnblogs.com/xiaozhumaopao/p/15439359.html 

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信