You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.8 KiB

import dotenv from 'dotenv';
import fs from 'fs';
import path from 'path';
import { logger } from '../utils/logger';
dotenv.config();
// 配置文件类型定义
interface ConfigFile {
server?: {
port?: number;
};
security?: {
jwtSecret?: string;
rateLimit?: {
windowMs?: number;
max?: number;
};
cors?: {
origin?: string;
methods?: string[];
allowedHeaders?: string[];
};
};
database?: {
postgreSQL?: {
host?: string;
port?: string;
username?: string;
password?: string;
database?: string;
};
};
dataSource?: any;
}
// 从文件读取配置
let fileConfig: ConfigFile = {};
try {
const configPath = path.join(__dirname, '../../../config.json');
if (fs.existsSync(configPath)) {
const configData = fs.readFileSync(configPath, 'utf8');
fileConfig = JSON.parse(configData);
logger.log('已读取配置文件:', configPath);
logger.log('配置文件内容:', fileConfig);
}
} catch (error) {
logger.error('读取配置文件失败:', error);
}
export const config = {
port: process.env.PORT || (fileConfig.server?.port || 3007),
jwtSecret: process.env.JWT_SECRET || (fileConfig.security?.jwtSecret || 'your-secret-key'),
database: {
mongo: {
url: process.env.MONGO_URL || 'mongodb://localhost:27017/alpha-futures'
},
postgres: {
host: process.env.PG_HOST || (fileConfig.database?.postgreSQL?.host || 'localhost'),
port: parseInt(process.env.PG_PORT || (fileConfig.database?.postgreSQL?.port || '5432')),
user: process.env.PG_USER || (fileConfig.database?.postgreSQL?.username || 'postgres'),
password: process.env.PG_PASSWORD || (fileConfig.database?.postgreSQL?.password || 'password'),
database: process.env.PG_DATABASE || (fileConfig.database?.postgreSQL?.database || 'alpha-futures')
},
mysql: {
host: process.env.MYSQL_HOST || 'localhost',
port: parseInt(process.env.MYSQL_PORT || '3306'),
user: process.env.MYSQL_USER || 'root',
password: process.env.MYSQL_PASSWORD || 'password',
database: process.env.MYSQL_DATABASE || 'alpha-futures'
}
},
redis: {
url: process.env.REDIS_URL || 'redis://localhost:6379'
},
rateLimit: {
windowMs: fileConfig.security?.rateLimit?.windowMs || 60 * 1000, // 1分钟
max: fileConfig.security?.rateLimit?.max || 120 // 每分钟120次请求
},
cors: {
origin: fileConfig.security?.cors?.origin || '*', // 在生产环境中应该设置具体的域名
methods: fileConfig.security?.cors?.methods || ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: fileConfig.security?.cors?.allowedHeaders || ['Content-Type', 'Authorization']
},
dataSource: (() => {
const dataSourceConfig = fileConfig.dataSource || {
test: {
enabled: true,
timeout: 10000,
retries: 3,
refreshInterval: 60000
},
tqsdk: {
enabled: true,
apiKey: '',
apiSecret: '',
username: '',
password: '',
timeout: 30000,
retries: 3,
maxConnections: 5
},
wind: {
enabled: false,
apiKey: '',
apiSecret: '',
url: 'https://api.wind.com.cn',
timeout: 30000,
retries: 3
},
sina: {
enabled: false,
url: 'https://finance.sina.com.cn',
timeout: 10000,
retries: 3,
refreshInterval: 60000
},
defaultDataSource: 'tqsdk'
};
logger.log('数据源配置初始化完成:', {
hasFileConfig: !!fileConfig.dataSource,
enabledDataSources: Object.keys(dataSourceConfig).filter(key =>
key !== 'defaultDataSource' && dataSourceConfig[key].enabled
),
defaultDataSource: dataSourceConfig.defaultDataSource
});
return dataSourceConfig;
})()
};