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

时间:2019-08-03 21:38:22

标签: logging nestjs fastify

我在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之前获得服务?

1 个答案:

答案 0 :(得分:1)

因此,我设法通过Nest的应用程序上下文解决了这个问题:

    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来获取服务,然后必须关闭它,以使其不占用数据库连接,然后创建使用包含与我先前创建和销毁的服务相同的容器的Application。

理想情况下,将有一种方法可以将ApplicationContext转换为NestFastifyApplication。如果有人知道该怎么做或只是对如何实现有更好的主意-我们欢迎您。我不会很快接受我自己的答案。