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