使用 Fastify 的 NestJs 在 app.listen() 之后不执行代码

NestJs with Fastify doesn't execute code after app.listen()

这是我的第一个问题,所以如果我错过了一些重要的事情,我想提前道歉。

所以这是非常基本的,但我没有在任何地方找到答案,正如标题所述,我的 NestJs 应用程序 运行 Fastify,在 app.listen( 'port') 行,Express 不会发生这种情况。 OBS:我指的是 main.ts 文件。

相关代码如下:

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter({ logger: { level: 'warn' } }),
  );

  const configService = app.get(ConfigService);
  await app.listen(configService.get<number>(ENV_KEYS.PORT), '0.0.0.0');

  console.log(
    `Application is running on: ${await app.getUrl()}\nApplication Version: ${version}`,
  );
}
bootstrap();

await app.listen 之后的 console.log() 永远不会执行,即使应用程序正常运行,据我的测试显示,await app.listen() 之后的代码也不会执行。

我想知道如何解决这个问题,因为我需要在应用程序启动后 运行 一些代码。

所以感谢@Micael Levi 指出我在 github (github.com/nestjs/nest/issues/7572) 上的一个问题,我开始研究我的控制器中的问题,以及冻结的原因app.listen() 上的应用程序是因为我的 AuthController 的“双重实例”,让我解释一下

我在 AuthModule 上定义了我的 AuthController:

// auth.module.ts
@Module({
    imports: [
        PassportModule,
        JwtModule.register({
            secret: JWT_CONSTANTS.SECRET,
        }),
    ],
    controllers: [AuthController],
    providers: [AuthService, LocalStrategy, JwtStrategy],
    exports: [AuthService, LocalStrategy, JwtStrategy],
})

并且在 AppModule 中,我在导入 AuthModule 的同时还再次声明了 AuthController:

// app.module.ts
@Module({
  imports: [
    ConfigModule.forRoot(getConfigServiceConfiguration()),
    TypeOrmModule.forRootAsync({
      useFactory: async (configService: ConfigService) =>
        getDatabaseModuleOptionsAsync(configService),
      inject: [ConfigService],
    }),
    AuthModule, // <-AuthController is declared within AuthModule scope
    UsuarioModule,
    ClienteModule,
  ],
  controllers: [AppController, AuthController] // <- AuthController here again,
  providers: [AppService],
})

从 AppModule 中的 controllers:[] 中删除 AuthController 解决了我的问题。菜鸟错误,但出于某种原因,这不是 express 的问题,也不会引发 Fastify 的任何编译错误!