75 lines
2.7 KiB
TypeScript
75 lines
2.7 KiB
TypeScript
|
|
import { NestFactory } from '@nestjs/core';
|
|||
|
|
import { ValidationPipe, Logger } from '@nestjs/common';
|
|||
|
|
import { ConfigService } from '@nestjs/config';
|
|||
|
|
import { NestExpressApplication } from '@nestjs/platform-express';
|
|||
|
|
import { join } from 'path';
|
|||
|
|
import { AppModule } from './app.module';
|
|||
|
|
import * as compression from 'compression';
|
|||
|
|
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
|
|||
|
|
|
|||
|
|
async function bootstrap() {
|
|||
|
|
const app = await NestFactory.create<NestExpressApplication>(AppModule, {
|
|||
|
|
logger: ['error', 'warn', 'log', 'debug', 'verbose'],
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 增加请求体大小限制(支持上传大文件 base64)
|
|||
|
|
// 1GB 文件编码后约 1.33GB,加上其他字段,设置为 1500mb
|
|||
|
|
app.useBodyParser('json', { limit: '1500mb' });
|
|||
|
|
app.useBodyParser('urlencoded', { limit: '1500mb', extended: true });
|
|||
|
|
|
|||
|
|
const configService = app.get(ConfigService);
|
|||
|
|
|
|||
|
|
// 全局验证管道
|
|||
|
|
app.useGlobalPipes(
|
|||
|
|
new ValidationPipe({
|
|||
|
|
whitelist: true,
|
|||
|
|
forbidNonWhitelisted: true,
|
|||
|
|
transform: true,
|
|||
|
|
transformOptions: {
|
|||
|
|
enableImplicitConversion: true,
|
|||
|
|
},
|
|||
|
|
}),
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 全局异常过滤器
|
|||
|
|
app.useGlobalFilters(new HttpExceptionFilter());
|
|||
|
|
|
|||
|
|
// 启用压缩
|
|||
|
|
// app.use(compression());
|
|||
|
|
|
|||
|
|
// CORS
|
|||
|
|
app.enableCors({
|
|||
|
|
origin: configService.get('FRONTEND_URL') || 'http://localhost:5173',
|
|||
|
|
credentials: true,
|
|||
|
|
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
|
|||
|
|
allowedHeaders: 'Content-Type, Accept, Authorization',
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 配置静态文件服务(用于访问上传的文件)
|
|||
|
|
// 使用绝对路径确保在编译后也能正确找到 uploads 目录
|
|||
|
|
const uploadsPath = join(__dirname, '..', '..', 'uploads');
|
|||
|
|
app.useStaticAssets(uploadsPath, {
|
|||
|
|
prefix: '/uploads/',
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// API前缀
|
|||
|
|
app.setGlobalPrefix('api/v1');
|
|||
|
|
|
|||
|
|
const port = configService.get<number>('PORT') || 3000;
|
|||
|
|
await app.listen(port);
|
|||
|
|
|
|||
|
|
console.log(`
|
|||
|
|
╔═════════════════════════════════════════════════════╗
|
|||
|
|
║ ║
|
|||
|
|
║ 🚀 幼儿阅读教学服务平台后端启动成功 ║
|
|||
|
|
║ ║
|
|||
|
|
║ 📍 Local: http://localhost:${port} ║
|
|||
|
|
║ 📍 API: http://localhost:${port}/api/v1 ║
|
|||
|
|
║ 📍 Prisma: npx prisma studio ║
|
|||
|
|
║ ║
|
|||
|
|
╚═════════════════════════════════════════════════════╝
|
|||
|
|
`);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bootstrap();
|