import { NestFactory } from '@nestjs/core'; import { ExpressAdapter } from '@nestjs/platform-express'; import { ValidationPipe } from '@nestjs/common'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import express from 'express'; import bodyParser from 'body-parser'; // 从源码导入,TypeScript 会编译到 dist import { AppModule } from '../src/app.module'; // 缓存 app 实例,避免每次冷启动都重新创建 let cachedApp: any; async function bootstrap() { if (!cachedApp) { const expressApp = express(); const app = await NestFactory.create( AppModule, new ExpressAdapter(expressApp), { logger: ['error', 'warn', 'log'] } ); // 配置 CORS app.enableCors({ origin: true, // 允许所有来源 credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], allowedHeaders: [ 'Content-Type', 'Authorization', 'Accept', 'Origin', 'Referer', 'User-Agent', ], }); // 尝试加载全局过滤器和拦截器 try { const { HttpExceptionFilter } = await import('../src/common/filters/http-exception.filter'); const { TransformInterceptor } = await import('../src/common/interceptors/transform.interceptor'); app.useGlobalFilters(new HttpExceptionFilter()); app.useGlobalInterceptors(new TransformInterceptor()); } catch (error) { console.log('Global filters/interceptors not loaded:', error.message); } // 全局验证管道 app.useGlobalPipes( new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, }), ); // Body parser 配置 app.use(bodyParser.json({ limit: '50mb' })); app.use(bodyParser.urlencoded({ limit: '50mb', extended: true })); // Swagger 文档 const config = new DocumentBuilder() .setTitle('API 文档') .setDescription('这是我的应用程序的 API 文档') .setVersion('1.0') .addBearerAuth() .build(); const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('api', app, document); await app.init(); cachedApp = expressApp; console.log('NestJS app initialized successfully'); } return cachedApp; } // Vercel Serverless handler export default async function handler(req: any, res: any) { try { console.log(`Request: ${req.method} ${req.url}`); const app = await bootstrap(); app(req, res); } catch (error) { console.error('Handler error:', error); res.status(500).json({ error: 'Internal Server Error', message: error.message, stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }); } }