在 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。如果有人知道如何去做或者只是更好地了解如何实施它 - 不客气。我不会很快接受我自己的回答。
我在 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。如果有人知道如何去做或者只是更好地了解如何实施它 - 不客气。我不会很快接受我自己的回答。