fix: 修复 Vercel 部署 404 和 Swagger 无法访问

- vercel.json: builds.src 从 package.json 改为 api/index.ts,routes.dest 从 /dist/api/index.js 改为 /api
- api/index.ts: 修正 require 路径,移除多余的 src/ 前缀
- api/index.ts: Swagger 挂载路径从 /api 改为 /docs,避免与 Vercel 函数路径冲突
- package.json: 添加 vercel-build 脚本确保部署前编译 NestJS
This commit is contained in:
lichao 2026-03-04 19:30:07 +08:00
parent f557f8581b
commit 914e156cc6
3 changed files with 14 additions and 9 deletions

View File

@ -13,12 +13,12 @@ async function bootstrap() {
const expressApp = express(); const expressApp = express();
// 使用 require 动态加载编译后的模块(避免 TypeScript 编译时检查) // 使用 require 动态加载编译后的模块(避免 TypeScript 编译时检查)
const { AppModule } = require('../dist/src/app.module'); const { AppModule } = require('../dist/app.module');
const app = await NestFactory.create( const app = await NestFactory.create(
AppModule, AppModule,
new ExpressAdapter(expressApp), new ExpressAdapter(expressApp),
{ logger: ['error', 'warn', 'log'] } { logger: ['error', 'warn', 'log'] },
); );
// 配置 CORS // 配置 CORS
@ -38,8 +38,12 @@ async function bootstrap() {
// 尝试加载全局过滤器和拦截器 // 尝试加载全局过滤器和拦截器
try { try {
const { HttpExceptionFilter } = require('../dist/src/common/filters/http-exception.filter'); const {
const { TransformInterceptor } = require('../dist/src/common/interceptors/transform.interceptor'); HttpExceptionFilter,
} = require('../dist/common/filters/http-exception.filter');
const {
TransformInterceptor,
} = require('../dist/common/interceptors/transform.interceptor');
app.useGlobalFilters(new HttpExceptionFilter()); app.useGlobalFilters(new HttpExceptionFilter());
app.useGlobalInterceptors(new TransformInterceptor()); app.useGlobalInterceptors(new TransformInterceptor());
} catch (error) { } catch (error) {
@ -67,7 +71,7 @@ async function bootstrap() {
.addBearerAuth() .addBearerAuth()
.build(); .build();
const document = SwaggerModule.createDocument(app, config); const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document); SwaggerModule.setup('docs', app, document);
await app.init(); await app.init();
cachedApp = expressApp; cachedApp = expressApp;
@ -88,7 +92,7 @@ export default async function handler(req: any, res: any) {
res.status(500).json({ res.status(500).json({
error: 'Internal Server Error', error: 'Internal Server Error',
message: error.message, message: error.message,
stack: process.env.NODE_ENV === 'development' ? error.stack : undefined stack: process.env.NODE_ENV === 'development' ? error.stack : undefined,
}); });
} }
} }

View File

@ -20,7 +20,8 @@
"test:watch": "jest --watch", "test:watch": "jest --watch",
"test:cov": "jest --coverage", "test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json" "test:e2e": "jest --config ./test/jest-e2e.json",
"vercel-build": "npx nest build"
}, },
"dependencies": { "dependencies": {
"@nestjs/cache-manager": "2.1.0", "@nestjs/cache-manager": "2.1.0",

View File

@ -2,14 +2,14 @@
"version": 2, "version": 2,
"builds": [ "builds": [
{ {
"src": "package.json", "src": "api/index.ts",
"use": "@vercel/node" "use": "@vercel/node"
} }
], ],
"routes": [ "routes": [
{ {
"src": "/(.*)", "src": "/(.*)",
"dest": "/dist/api/index.js" "dest": "/api"
} }
] ]
} }