es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Refrescar módulo dinámico cuando cambie en NestJS.

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],
})

La configuración para MailerModule se lee desde la base de datos. Esto también funciona para el arranque de la aplicación. Solo si inicio la aplicación y luego hago cambios en la base de datos, ¿cómo puedo volver a cargar el módulo sin reiniciar completamente nestjs? actualmente, la configuración cargada en el arranque permanece hasta el reinicio.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para recargar la configuración de MailerModule sin reiniciar completamente NestJS, puedes utilizar el método apply() proporcionado por la API de MailerModule. A continuación, se detallan los pasos a seguir:

    1. Crea un servicio separado que recupere la configuración desde la base de datos y la devuelva como un objeto. Por ejemplo:
    @Injectable()
    export class MailConfigService {
      constructor(private readonly configService: ConfigService) {}
    
      async getMailServerConfig(): Promise<maileroptions> {
        const mailServerConfig = await this.configService.getMailserver(true);
        // transforma la configuración del servidor de correo en un objeto MailerOptions
        const mailerOptions: MailerOptions = {
          transport: {
            host: mailServerConfig.host,
            port: mailServerConfig.port,
            // ... otras opciones de transporte
          },
          defaults: {
            // ... otras opciones predeterminadas
          },
        };
        return mailerOptions;
      }
    }
    
    1. Inyecta MailerService y MailConfigService en un controlador que maneje el cambio de configuración. Por ejemplo:
    @Controller('mail')
    export class MailController {
      constructor(
        private readonly mailService: MailerService,
        private readonly mailConfigService: MailConfigService,
      ) {}
    
      @Patch('config')
      async updateMailServerConfig(): Promise<void> {
        const mailerOptions = await this.mailConfigService.getMailServerConfig();
        // aplica las nuevas opciones del remitente al servicio de correo instanciado
        this.mailService
          .apply(mailerOptions)
          .catch((error) => console.error(error));
      }
    }
    
    1. Utiliza una solicitud HTTP PATCH para activar la acción del controlador y actualizar el MailerService con la nueva configuración.

    Cuando el método apply() se llama con un nuevo objeto MailerOptions, actualiza la instancia de transporte del remitente existente con la nueva configuración. Esto te permite recargar la configuración del MailerModule sin tener que reiniciar la aplicación NestJS.

Comments are closed.