Files
a-share-analysis/server/apps/api/src/main.ts
T

41 lines
1.4 KiB
TypeScript

import 'reflect-metadata';
import { type INestApplication, type NestApplicationOptions } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import path from 'node:path';
import { loadApiProcessConfig } from '../../../libs/config/src/load-process-env';
import {
toSafeRuntimeSummary,
type ApiRuntimeConfig,
} from '../../../libs/config/src/runtime-config';
import { ApiModule } from './api.module';
/** API 引导参数只接受已完成进程级校验的配置,测试可覆盖监听端口和日志器。 */
interface BootstrapApiOptions {
config: ApiRuntimeConfig;
port?: number;
logger?: NestApplicationOptions['logger'];
}
/** 启动可独立部署的 API;配置由入口显式注入,监听前已完成全部校验。 */
export async function bootstrapApi(options: BootstrapApiOptions): Promise<INestApplication> {
const app = await NestFactory.create(ApiModule.register(options.config), {
logger: options.logger,
});
app.setGlobalPrefix('api/v1');
app.enableShutdownHooks();
await app.listen(options.port ?? options.config.api.port, options.config.api.host);
return app;
}
async function runApi(): Promise<void> {
const config = loadApiProcessConfig();
console.info('API 进程启动配置', toSafeRuntimeSummary(config));
await bootstrapApi({ config });
}
if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(__filename)) {
void runApi();
}