diff --git a/api/index.ts b/api/index.ts index f8ff2f1..c0659b4 100644 --- a/api/index.ts +++ b/api/index.ts @@ -1,19 +1,31 @@ import { NestFactory } from '@nestjs/core'; -import { AppModule } from '../src/app.module'; +import { ExpressAdapter } from '@nestjs/platform-express'; +import { AppModule } from '../dist/app.module'; import { HttpExceptionFilter } from '../src/common/filters/http-exception.filter'; import { TransformInterceptor } from '../src/common/interceptors/transform.interceptor'; import { ValidationPipe } from '@nestjs/common'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import * as express from 'express'; import * as bodyParser from 'body-parser'; -let cachedApp; +// 缓存 app 实例,避免每次冷启动都重新创建 +let cachedApp: any; async function bootstrap() { if (!cachedApp) { - const app = await NestFactory.create(AppModule); + const expressApp = express(); + const app = await NestFactory.create( + AppModule, + new ExpressAdapter(expressApp), + ); + // 配置 CORS app.enableCors({ - origin: true, + origin: [ + 'https://tradingadvfrontend.vercel.app', + 'http://localhost:8000', + 'http://localhost:3030', + ], credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], allowedHeaders: [ @@ -26,8 +38,11 @@ async function bootstrap() { ], }); + // 全局过滤器和拦截器 app.useGlobalFilters(new HttpExceptionFilter()); app.useGlobalInterceptors(new TransformInterceptor()); + + // 全局验证管道 app.useGlobalPipes( new ValidationPipe({ whitelist: true, @@ -36,12 +51,13 @@ async function bootstrap() { }), ); + // Body parser 配置 app.use(bodyParser.json({ limit: '50mb' })); app.use(bodyParser.urlencoded({ limit: '50mb', extended: true })); - // Swagger 配置 + // Swagger 文档 const config = new DocumentBuilder() - .setTitle('我的应用 API') + .setTitle('API 文档') .setDescription('这是我的应用程序的 API 文档') .setVersion('1.0') .addBearerAuth() @@ -50,14 +66,13 @@ async function bootstrap() { SwaggerModule.setup('api', app, document); await app.init(); - cachedApp = app; + cachedApp = expressApp; } - return cachedApp; } -export default async (req, res) => { +// Vercel Serverless handler +export default async function handler(req: any, res: any) { const app = await bootstrap(); - const server = app.getHttpAdapter().getInstance(); - return server(req, res); -}; + app(req, res); +}