import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { Logger, ValidationPipe } from '@nestjs/common'; import { PrismaService } from './prisma/prisma.service'; import { ConfigService as SysConfigService } from '@/modules/system/config/config.service'; import { ConfigService } from '@nestjs/config'; import { HttpExceptionFilter } from 'src/common/http-exception.filter'; import { HttpInterceptor } from 'src/common/http.interceptor'; import { WinstonModule } from 'nest-winston'; import { transports, format } from 'winston'; import 'winston-daily-rotate-file'; async function bootstrap() { const logFormat = format.combine( format.timestamp(), format.printf((info) => { return `${info.timestamp} ${info.level} ${info.context} ${info.message}`; }), ); const app = await NestFactory.create(AppModule, { logger: WinstonModule.createLogger({ transports: [ // 记录错误日志 new transports.DailyRotateFile({ filename: `logs/%DATE%/error.log`, level: 'error', datePattern: 'YYYY-MM-DD', maxFiles: '30d', format: logFormat, }), // logging all level new transports.DailyRotateFile({ filename: `logs/%DATE%/combined.log`, datePattern: 'YYYY-MM-DD', maxFiles: '30d', format: logFormat, }), // 控制台输出 new transports.Console({ format: format.combine( format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.colorize({ all: true }), logFormat, ), }), ], }), }); app.useGlobalPipes( new ValidationPipe({ transform: true, whitelist: true, }), ); // 全局异常过滤器 app.useGlobalFilters(new HttpExceptionFilter()); app.useGlobalInterceptors(new HttpInterceptor()); // prisma const prismaService = app.get(PrismaService); await prismaService.enableShutdownHooks(app); // 同步配置到redis const sysConfigService = app.get(SysConfigService); await sysConfigService.syncConfig(); const config = app.get(ConfigService); // 跨域 app.enableCors(); // 设置全局前缀 app.setGlobalPrefix('api'); const logger = new Logger('Server Running'); await app.listen(config.get('server.port'), '0.0.0.0', async () => { logger.log(`Application is running on: ${await app.getUrl()}`); }); } bootstrap();