fix: 启动时加载 server/.env 使 AI 配置生效

This commit is contained in:
liyy 2026-09-01 17:53:51 +08:00
parent c736b128f9
commit 88c479f730
6 changed files with 28 additions and 3 deletions

View File

@ -14,6 +14,7 @@
- `server/src/handlers/ai.ts`(重写):配置有效 → 调用 AI 并返回 `source:'ai'`;未配置 → `source:'fallback'`「AI 尚未配置」);超时 → `source:'fallback'`「AI 请求超时」);其余失败 → `source:'fallback'`「AI 讲解暂时不可用」)。回退内容为题库解析 + 标签 + 答案,前端可识别。
- `server/src/schemas/api.ts``AiExplainBodySchema.userAnswer` 改为可选(从错题详情进入且无作答历史时省略)。
- `server/.env.example`(新增):记录 PORT / DATA_DIR / AI 配置项说明。
- `server/src/env.ts` + `server.ts`(补充):引入 dotenv启动时最先加载 `server/.env`(进程内环境变量优先),确保 `PORT` / `DATA_DIR` / `AI_*` 在模块读取前就位;实测 `server/.env` 中配置 AI 变量后 `aiConfigured=true` 且讲解走 AI删除 `.env` 后自动回退。
### 前端

9
pnpm-lock.yaml generated
View File

@ -50,6 +50,9 @@ importers:
'@fastify/swagger-ui':
specifier: ^6.1.1
version: 6.1.1
dotenv:
specifier: ^17.4.2
version: 17.4.2
fastify:
specifier: latest
version: 5.12.1
@ -717,6 +720,10 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
dotenv@17.4.2:
resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
engines: {node: '>=12'}
entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
@ -1808,6 +1815,8 @@ snapshots:
detect-libc@2.1.2: {}
dotenv@17.4.2: {}
entities@7.0.1: {}
esbuild@0.28.2:

View File

@ -3,7 +3,7 @@ PORT=3000
# DATA_DIR=./data
# AI 讲解OpenAI 兼容 Chat Completions不配置时讲解自动回退题库解析
# AI_BASE_URL=https://api.openai.com/v1
# AI_API_KEY=sk-xxxxxxxx
# AI_MODEL=gpt-4o-mini
AI_BASE_URL=https://api.deepseek.com
AI_API_KEY=sk-xxxxxxxx
AI_MODEL=deepseek-v4-flash
# AI_TIMEOUT_MS=20000

View File

@ -11,6 +11,7 @@
"@fastify/cors": "latest",
"@fastify/swagger": "^9.8.1",
"@fastify/swagger-ui": "^6.1.1",
"dotenv": "^17.4.2",
"fastify": "latest",
"zod": "latest"
},

11
server/src/env.ts Normal file
View File

@ -0,0 +1,11 @@
import { config } from 'dotenv'
import { dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
/**
* server/.envdotenv
* process.env data/files.ts
* DATA_DIR / AI_*
*/
const serverRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
config({ path: join(serverRoot, '.env') })

View File

@ -1,3 +1,6 @@
// 最先加载 server/.envdotenv确保 DATA_DIR / PORT / AI_* 在模块读取前就位
import './env.js'
import { pathToFileURL } from 'node:url'
import Fastify from 'fastify'
import cors from '@fastify/cors'