异步提供程序的NestJS onModuleInit生命周期挂钩行为

异步提供程序的NestJS onModuleInit生命周期挂钩行为,nestjs,Nestjs,我正在尝试使用onModuleInit钩子初始化ConfigurationService。参考前面的代码,我希望在创建模块时调用钩子。然而,情况并非如此。基本上,我有: 配置服务: import { Injectable, OnModuleInit } from '@nestjs/common'; import { ApplicationConfiguration } from './interfaces/application-configuration.interface'; impor

我正在尝试使用onModuleInit钩子初始化ConfigurationService。参考前面的代码,我希望在创建模块时调用钩子。然而,情况并非如此。基本上,我有:

配置服务:

import { Injectable, OnModuleInit } from '@nestjs/common';

import { ApplicationConfiguration } from './interfaces/application-configuration.interface';

import { ServerConfiguration } from './interfaces/server-configuration.interface';

import * as path from 'path';

@Injectable()
export class ConfigurationService implements OnModuleInit {
    private _configuration: ApplicationConfiguration;

    public async getServerConfigurationAsync(): Promise<ServerConfiguration> {
        await this.ensureConfigurationIsLoadedAsync();

        return new Promise<ServerConfiguration>((resolve, reject) => {
            const serverConfiguration = this._configuration.server;

            if (!serverConfiguration) {
                reject(new Error('Missing server configuration.'));
            }

            return resolve(serverConfiguration);
        });
    }

    private async ensureConfigurationIsLoadedAsync(): Promise<void> {
        if (!this._configuration) {
            this._configuration = await this.fetchAppConfigurationAsync();
        }
    }

    private fetchAppConfigurationAsync(): Promise<ApplicationConfiguration> {
        const configDir = process.env.CONFIG_DIR;

        let configurationPath: string;

        if (configDir) {
            configurationPath = path.resolve(`configuration/${configDir}/config.json`);
        }
        else {
            configurationPath = path.resolve('configuration/config.json');
        }

        return new Promise<ApplicationConfiguration>((resolve, reject) => {
            try {
                const configuration = require(configurationPath);

                const mappedConfig: ApplicationConfiguration = {
                    server: configuration.server
                };

                resolve(mappedConfig);
            }
            catch (error) {
                console.log(`Can't fetch configuration at ${configurationPath}.`);

                reject(error);
            }
        });
    }

    // public async onModuleInit(): Promise<void> {
    //     console.log('ConfigurationService onModuleInit called.');

    //     await this.ensureConfigurationIsLoadedAsync();
    // }

    public  onModuleInit(): void {
        console.log('ConfigurationService onModuleInit called.');
    }
}
export const SERVER_CONFIGURATION_PROVIDER: Provider = {
    provide: CONFIGURATION_TOKENS.SERVER_CONFIGURATION,
    useFactory: async (configurationService: ConfigurationService): Promise<ServerConfiguration> => {
        console.log('SERVER_CONFIGURATION_PROVIDER useFactory called.');

        return await configurationService.getServerConfigurationAsync();
    },
    inject: [ConfigurationService]
}
@Module({
    providers: [
        ConfigurationService,
        SERVER_CONFIGURATION_PROVIDER
    ],
    exports: [
        SERVER_CONFIGURATION_PROVIDER
    ]
})
export class ConfigurationModule { 

    // public async onModuleInit(): Promise<void> {
    //     console.log('ConfigurationModule onModuleInit called.');
    // }
    public onModuleInit(): void {
        console.log('ConfigurationModule onModuleInit called.');
    }
}
@Controller('app')
export class AppController {
    private _serverConfig: ServerConfiguration;

    constructor(@Inject(CONFIGURATION_TOKENS.SERVER_CONFIGURATION) serverConfig: ServerConfiguration) {
        this._serverConfig = serverConfig;
    }

    @Get()
    public async getResult(): Promise<any> {
        return this._serverConfig;
    }
}
因此,我不确定该期待什么,也不确定我是否正确使用了生命周期。这是我启动应用程序时的日志:

Before app create
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [NestFactory] Starting Nest application...
SERVER_CONFIGURATION_PROVIDER useFactory called.
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [InstanceLoader] ConfigurationModule dependencies initialized +10ms
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [InstanceLoader] AppModule dependencies initialized +1ms
After app create
before listen
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [RoutesResolver] AppController {/api/app}: +5ms
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [RouterExplorer] Mapped {/api/app, GET} route +4ms
ConfigurationService onModuleInit called.
ConfigurationModule onModuleInit called.
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [NestApplication] Nest application successfully started +2ms
after listen
Listening at port 5000.
Before app create
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [NestFactory] Starting Nest application...
SERVER_CONFIGURATION_PROVIDER useFactory called.
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [InstanceLoader] ConfigurationModule dependencies initialized +10ms
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [InstanceLoader] AppModule dependencies initialized +1ms
After app create
before listen
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [RoutesResolver] AppController {/api/app}: +5ms
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [RouterExplorer] Mapped {/api/app, GET} route +4ms
ConfigurationService onModuleInit called.
ConfigurationModule onModuleInit called.
[Nest] 28132   - 10/05/2020, 4:12:38 PM   [NestApplication] Nest application successfully started +2ms
after listen
Listening at port 5000.