刷新Nestjs中动态模块的更改

3

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? - Aien Saidi
很遗憾,nestjs应用程序必须手动重新启动。 - pasek
1个回答

0

好消息:nest.js 中有一个名为 useFeature 的内置解决方案,可以从 docs 中准确地实现这一点:

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

forRoot,您预计将配置动态模块一次,并在多个位置重复使用该配置(尽管可能并不知道,因为它被抽象掉了)。这就是为什么您只有一个 GraphQLModule.forRoot(),一个 TypeOrmModule.forRoot()等的原因。

forFeature,您预计将使用动态模块的 forRoot 配置,但需要修改某些与调用模块需求相关的配置(即,这个模块应该访问哪个存储库,或者日志记录器应该使用哪个上下文)。

坏消息:关于这个功能以及如何使用它,没有足够的代码示例或详细文档。而且这不是第一次有人因为同样的问题而跌倒。只需看看这个线程:

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

你应该做什么:

首先,请检查您的邮件模块是否支持forFeatureAsync(剧透-它不支持)。

其次,深入了解并获取邮件服务定义service definition,这样MailerService就可以使用,您可以按照自己的喜好进行初始化。现在,您可以根据配置更新来管理内存以适应您的mailer实例,甚至可以开发自己的模块,并使用适当的forFeatureforFeatureAsyncAsync方法。

希望您能找到最适合自己的方式...祝您好运


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接