100 lines
3.2 KiB
TypeScript
100 lines
3.2 KiB
TypeScript
import { NestFactory } from '@nestjs/core';
|
||
import { AppModule } from './app.module';
|
||
import * as mysql from 'mysql2/promise';
|
||
import { ConfigService } from '@nestjs/config';
|
||
import * as dotenv from 'dotenv';
|
||
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
|
||
import { TransformInterceptor } from './common/interceptors/transform.interceptor';
|
||
import * as bodyParser from 'body-parser';
|
||
import { ValidationPipe } from '@nestjs/common';
|
||
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
|
||
|
||
dotenv.config();
|
||
|
||
// 创建数据库的函数
|
||
async function createDatabaseIfNotExists() {
|
||
try {
|
||
// 连接 MySQL(不指定数据库)
|
||
const connection = await mysql.createConnection({
|
||
host: process.env.SERVER_HOST,
|
||
user: process.env.SERVER_USER,
|
||
password: process.env.PASSWORD,
|
||
});
|
||
|
||
console.log('🔌 连接到 MySQL 服务器成功');
|
||
|
||
// 创建数据库(如果不存在)
|
||
await connection.query('CREATE DATABASE IF NOT EXISTS auth_db');
|
||
console.log('✅ 数据库 auth_db 创建成功或已存在');
|
||
|
||
await connection.end();
|
||
console.log('🔌 关闭数据库连接');
|
||
} catch (error) {
|
||
console.error('❌ 创建数据库失败:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
async function bootstrap() {
|
||
try {
|
||
// 1. 首先创建数据库
|
||
await createDatabaseIfNotExists();
|
||
|
||
// 2. 然后启动 Nest 应用(此时数据库已存在)
|
||
console.log('🚀 启动 NestJS 应用...');
|
||
const app = await NestFactory.create(AppModule);
|
||
const configService = app.get(ConfigService); // 获取 ConfigService 实例
|
||
|
||
app.enableCors({
|
||
origin: true, // 允许所有来源
|
||
credentials: true, // 允许携带凭证
|
||
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], // 明确指定允许的 HTTP 方法
|
||
allowedHeaders: [
|
||
'Content-Type',
|
||
'Authorization',
|
||
'Accept',
|
||
'Origin',
|
||
'Referer',
|
||
'User-Agent',
|
||
], // 允许的请求头
|
||
});
|
||
|
||
// 注册全局异常过滤器
|
||
app.useGlobalFilters(new HttpExceptionFilter());
|
||
|
||
// 注册全局响应转换拦截器
|
||
app.useGlobalInterceptors(new TransformInterceptor());
|
||
|
||
// 注册全局验证管道
|
||
app.useGlobalPipes(
|
||
new ValidationPipe({
|
||
whitelist: true, // 自动删除非 DTO 定义的属性
|
||
forbidNonWhitelisted: true, // 如果有非白名单属性,抛出错误
|
||
transform: true, // 自动转换类型
|
||
}),
|
||
);
|
||
|
||
// 使用 NestJS 内置方法设置限制
|
||
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.listen(3030);
|
||
console.log('✅ 应用启动成功,监听端口 3030');
|
||
} catch (error) {
|
||
console.error('❌ 应用启动失败:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
bootstrap();
|