同样的 main.ts 的代码,nest new 出来的一个初始项目就不会报错,而我们有其他应用代码的项目就会报错。
import {NestFactory} from '@nestjs/core';
import {
SwaggerModule,
DocumentBuilder,
SwaggerCustomOptions,
} from '@nestjs/swagger';
import {AppModule} from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = new DocumentBuilder()
.setTitle('Cloud Native InceptionPad Basic')
.setDescription('The API description')
.setVersion('1.0')
.addBearerAuth()
.build();
const document = SwaggerModule.createDocument(app, config);
const customOptions: SwaggerCustomOptions = {
swaggerOptions: {
persistAuthorization: true,
},
customSiteTitle: 'InceptionPad API Docs',
};
SwaggerModule.setup('api', app, document, customOptions);
await app.listen(3000);
}
bootstrap();
下图为 nest new 的新项目:
下图为开发中的项目:
猜测
某个 module 导致了 swagger 的报错。于是,AppModule 的 imports 删掉,node 可以正常启动了。
// app.module.ts
import {Module, MiddlewareConsumer} from '@nestjs/common';
import {AuthModule} from './_basic/_auth/_auth.module';
import {UserModule} from './_basic/_user/_user.module';
import {RoleModule} from './_basic/_role/_role.module';
import {HttpLoggerMiddleware} from './_basic/_logger/_http-logger.middleware';
@Module({
imports: [AuthModule, UserModule, RoleModule],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(HttpLoggerMiddleware).forRoutes('*');
}
}
然而,使用相同的 app.module.ts,将各个 module 逐个复制到新项目中,node 总是可以正常启动的,说明各个 module 的代码是没有问题的。
对比工程文件
由于开发中的项目用到了 gts,在 gts init 的时候,覆盖了 tsconfig.json 等几个 nest 框架原有的配置文件。逐个排查配置文件,确定是由于 tsconfig.json 的覆盖导致的报错。