【问题标题】:Refresh dynamic module on change in nestjs在nestjs中刷新动态模块
【发布时间】:2022-10-21 02:17:53
【问题描述】:

app.module.ts

import { MailerModule, MailerOptions } from '@nestjs-modules/mailer';

@Module({
    imports: [
        ...
        MailerModule.forRootAsync({
            imports: [ServiceModule],
            inject: [ConfigService],
            useFactory: async (configService: ConfigService) => {
                return  await configService.getMailserver(true);
            }
        }),
    ],
    controllers: [AppController],
})

MailerModule 的配置是从数据库中读取的。这也适用于应用程序的引导程序。仅当应用程序启动然后我在数据库中进行更改时,如何在没有完整的nestjs重新启动的情况下重新加载模块?目前在引导时加载的配置会一直保留到重新启动。

【问题讨论】:

  • 你能找到这个@pasek 的解决方案吗?
  • 不幸的是,nestjs 应用程序必须手动重新启动..

标签: nestjs nodemailer


【解决方案1】:

好消息:nest.js 中有一个名为useFeature 的内置解决方案,它与docs 完全一样:

登记,您期望配置具有特定配置的动态模块,仅供调用模块使用。例如,使用 Nest 的 @nestjs/axios:HttpModule.register({ baseUrl: 'someUrl' })。如果在另一个模块中使用 HttpModule.register({ baseUrl: 'somewhere else' }),它将具有不同的配置。您可以根据需要对任意数量的模块执行此操作。

为根,您期望配置一个动态模块并在多个地方重用该配置(尽管可能在不知不觉中,因为它被抽象掉了)。这就是为什么你有一个 GraphQLModule.forRoot()、一个 TypeOrmModule.forRoot() 等。

为特征,您希望使用动态模块的 forRoot 的配置,但需要修改一些特定于调用模块需求的配置(即该模块应该有权访问哪个存储库,或者记录器应该使用的上下文。)

坏消息:没有足够的代码示例或有关此功能以及如何使用它的详细文档。这不是第一次有人因为完全相同的问题而绊倒。看看这个thread

您可以使用 .forFeatureAsync() 来提供您的模型,如文档中所述,并将其他模块注入您定义的工厂函数中,就像在服务中一样。唯一的区别是您不使用@InjectModel 装饰任何架构工厂方法参数,而是在 forFeatureAsync 的注入数组中添加一个条目,其中该条目是使用 mongoose.util.ts 中提到的 getModelToken() 方法定义的文档的测试部分。

你应该做什么:

首先,检查您的邮件模块是否支持forFeatureAsync(剧透警报 - it doesn't)。

其次,挖掘并获取邮件程序的service definition,因此MailerService 可用,您可以随意发起它。现在您可以管理您的内存以适应您的mailer instance 的配置更新,或者甚至可以使用适当的forFeatureforFeatureAsyncAsync 方法开发您自己的模块。

希望你能找到最适合你的方式......祝你好运

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2022-12-20
    • 2020-04-17
    • 2019-04-17
    • 2020-09-30
    相关资源
    最近更新 更多