import Joi from 'joi'; /** * 应用配置验证模式 */ export const AppConfigSchema = Joi.object({ NODE_ENV: Joi.string().valid('development', 'test', 'production').required(), PORT: Joi.number().default(3000), APP_NAME: Joi.string().optional(), APP_VERSION: Joi.string().optional(), TZ: Joi.string().optional(), // 数据库配置验证 DB_HOST: Joi.string().required(), DB_PORT: Joi.number().required(), DB_USERNAME: Joi.string().required(), DB_PASSWORD: Joi.string().allow('').required(), DB_DATABASE: Joi.string().required(), DB_SYNC: Joi.boolean().optional(), DB_LOGGING: Joi.boolean().optional(), // 补充数据库连接细粒度参数(与 appConfig.ts 对齐) DB_CONN_LIMIT: Joi.number().optional(), DB_ACQUIRE_TIMEOUT_MS: Joi.number().optional(), DB_QUERY_TIMEOUT_MS: Joi.number().optional(), DB_CACHE_DURATION_MS: Joi.number().optional(), DB_TIMEZONE: Joi.string().optional(), DB_CHARSET: Joi.string().optional(), // Redis配置验证 REDIS_HOST: Joi.string().optional(), REDIS_PORT: Joi.number().optional(), REDIS_PASSWORD: Joi.string().allow('').optional(), REDIS_DB: Joi.number().optional(), REDIS_KEY_PREFIX: Joi.string().optional(), // Kafka配置验证 KAFKA_CLIENT_ID: Joi.string().optional(), KAFKA_BROKERS: Joi.string().optional(), KAFKA_GROUP_ID: Joi.string().optional(), KAFKA_TOPIC_PREFIX: Joi.string().optional(), // JWT配置验证 JWT_SECRET: Joi.string().required(), JWT_EXPIRES_IN: Joi.string().optional(), JWT_ALGORITHM: Joi.string().optional(), // 缓存配置验证 CACHE_TTL: Joi.number().optional(), CACHE_MAX_ITEMS: Joi.number().optional(), CACHE_PREFIX: Joi.string().optional(), // 日志配置验证 LOG_LEVEL: Joi.string().optional(), LOG_FORMAT: Joi.string().optional(), LOG_FILENAME: Joi.string().optional(), // 上传配置验证 UPLOAD_PATH: Joi.string().optional(), UPLOAD_MAX_SIZE: Joi.number().optional(), UPLOAD_ALLOWED_TYPES: Joi.string().optional(), // 限流配置验证 THROTTLE_TTL: Joi.number().optional(), THROTTLE_LIMIT: Joi.number().optional(), // 健康检查配置验证 STARTUP_HEALTH_CHECK: Joi.string().valid('true', 'false').optional(), STARTUP_HEALTH_TIMEOUT_MS: Joi.number().optional(), // 队列配置验证(当前为可选项,供队列模块读取) TASK_QUEUE_ADAPTER: Joi.string() .valid('redis', 'database-outbox', 'memory') .optional(), QUEUE_REMOVE_ON_COMPLETE: Joi.number().optional(), QUEUE_REMOVE_ON_FAIL: Joi.number().optional(), QUEUE_DEFAULT_ATTEMPTS: Joi.number().optional(), QUEUE_BACKOFF_DELAY: Joi.number().optional(), // 第三方服务配置验证 STORAGE_PROVIDER: Joi.string().optional(), STORAGE_CONFIG: Joi.string().optional(), PAYMENT_PROVIDER: Joi.string() .valid('mock', 'alipay', 'wechat', 'stripe') .optional(), PAYMENT_CONFIG: Joi.string().optional(), SMS_PROVIDER: Joi.string().optional(), SMS_CONFIG: Joi.string().optional(), }).unknown(true); /** * 验证配置 * @param config 配置对象 * @returns 验证结果 */ export function validateAppConfig(config: Record) { const { error, value } = AppConfigSchema.validate(config, { allowUnknown: true, abortEarly: false, }); if (error) { throw new Error(`应用配置验证失败: ${error.message}`); } return value; }