在 Nest.js 中延迟将记录器选项传递给 FastifyAdapter

Delay passing logger options to FastifyAdapter in Nest.js

我在 Nest.js 应用程序中使用 Fastify 而不是 Express,我想为 Fastify 配置日志记录。 ConfigService 提供了日志记录(以及许多其他东西)的配置。但是,服务仅在创建 Nest 的 app 对象后可用,但我必须在创建它时更早地提供记录器选项。它看起来像这样:

    const app = await NestFactory.create<NestFastifyApplication>(
      AppModule,
      new FastifyAdapter(loggerConfig)
    );
    const config = app.get('ConfigService') as ConfigService;

如何使用 ConfigService 将 loggerConfig 提供给 FastifyAdapter?有没有一种方法可以延迟使用 Fastify 设置记录器,或者有一种方法可以在创建 app 之前获取服务?

所以,我设法用 Nest 的 Application Context 解决了这个问题:

    async function bootstrap(): Promise<void> {
      const ctx = await NestFactory.createApplicationContext(AppModule);
      const config = ctx.get('ConfigService') as ConfigService;
      const logger = ctx.get('LoggerService') as LoggerService;
      await ctx.close();

      const app = await NestFactory.create<NestFastifyApplication>(
        AppModule,
        new FastifyAdapter({ logger: logger.log })
      );
      ...
    }
    bootstrap();

但是我觉得很丑。请看:首先我创建 ApplicationContext 以从中获取服务,然后我必须关闭它以便它不占用数据库连接,然后创建应用程序,该应用程序使用包含我之前创建和销毁的相同服务的容器。

理想情况下,有一种方法可以将 ApplicationContext 转换为 NestFastifyApplication。如果有人知道如何去做或者只是更好地了解如何实施它 - 不客气。我不会很快接受我自己的回答。