0

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

所以这是非常基本的,但我没有在任何地方找到答案,正如标题所述,我的 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();

console.log()after永远不会执行,await app.listen即使应用程序正常工作,而且据我的测试显示,没有代码 afterawait app.listen()执行过。

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

4

1 回答 1

0

因此,感谢@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 的编译错误!

于 2021-08-04T00:07:10.217 回答