修复报错
This commit is contained in:
40
docs/technical/NODE_DEV_STARTUP_HOTFIX_2026-04-20.md
Normal file
40
docs/technical/NODE_DEV_STARTUP_HOTFIX_2026-04-20.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# Node Dev 启动热修记录 2026-04-20
|
||||
|
||||
## 背景
|
||||
|
||||
2026-04-20 执行 `npm run dev` 时,Node 后端在加载 `server-node/src/modules/story/storyActionService.ts` 过程中报错:
|
||||
|
||||
- `TransformError`
|
||||
- `Unterminated string literal`
|
||||
- 触发行位于 `storyActionService.ts:17`
|
||||
|
||||
该问题会导致前端 Vite 服务启动成功,但 `server-node` 无法完成编译和监听,开发态故事运行链路不可用。
|
||||
|
||||
## 根因
|
||||
|
||||
`storyActionService.ts` 中导入库存剧情动作服务的语句被意外拆断,形成了非法字符串字面量:
|
||||
|
||||
- 路径在 `../inventory/inventory` 后被换行截断
|
||||
- 真实目标文件名 `inventoryStoryActionService.js` 没有完整写入
|
||||
|
||||
这属于单点语法错误,不涉及运行时逻辑回归。
|
||||
|
||||
## 修复
|
||||
|
||||
本次只做最小代码补丁:
|
||||
|
||||
- 将导入恢复为 `../inventory/inventoryStoryActionService.js`
|
||||
- 保持原文件其余中文文案、剧情文本与结构不动
|
||||
|
||||
## 验证
|
||||
|
||||
修复后已完成以下验证:
|
||||
|
||||
- `npm run dev`:`server-node` 于 2026-04-20 03:51:24 UTC 成功启动,日志显示监听 `:8081`
|
||||
- `npm run check:encoding`:通过,`1641` 个文件编码检查正常
|
||||
- `npm run server-node:build`:通过
|
||||
|
||||
## 后续约束
|
||||
|
||||
- 继续对包含中文文本的运行时故事文件采用局部补丁,避免整文件重写
|
||||
- 再次调整 `storyActionService.ts` 或相邻剧情服务时,优先补跑编码检查与后端构建
|
||||
@@ -4,6 +4,9 @@
|
||||
|
||||
## 文档列表
|
||||
|
||||
- [SPACETIME_DEV_URI_HOTFIX_2026-04-20.md](./SPACETIME_DEV_URI_HOTFIX_2026-04-20.md):修复开发默认配置把 Spacetime 连接误指向 Vite `3000` 端口的问题。
|
||||
- [SPACETIME_AUTH_TOKEN_FALLBACK_HOTFIX_2026-04-20.md](./SPACETIME_AUTH_TOKEN_FALLBACK_HOTFIX_2026-04-20.md):本地 token 失效时自动降级匿名连接,并提示“登录已过期”的热修记录。
|
||||
- [NODE_DEV_STARTUP_HOTFIX_2026-04-20.md](./NODE_DEV_STARTUP_HOTFIX_2026-04-20.md):`npm run dev` 启动失败的热修记录、根因与验证结果。
|
||||
- [NODE_SERVER_KNOWLEDGE_GRAPH_2026-04-08.md](./NODE_SERVER_KNOWLEDGE_GRAPH_2026-04-08.md):当前 Node 运行时后端的技术栈、入口、鉴权、存储与接口知识图谱。
|
||||
- [EXPRESS_BACKEND_INTEGRATION_FREEZE_2026-04-09.md](./EXPRESS_BACKEND_INTEGRATION_FREEZE_2026-04-09.md):Express 后端当前 contract 冻结版本、热点文件编辑规则与集成窗口清单。
|
||||
- [EXPRESS_BACKEND_WORKSTREAM_AUDIT_2026-04-09.md](./EXPRESS_BACKEND_WORKSTREAM_AUDIT_2026-04-09.md):按并行工作流文档逐项核对后的完成度审计与剩余收口点。
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
# Spacetime 账号连接过期回退热修 2026-04-20
|
||||
|
||||
## 背景
|
||||
|
||||
当前网页启动时会先尝试复用本地保存的 Spacetime token 建立账号连接。
|
||||
|
||||
问题表现:
|
||||
|
||||
- 页面长时间停留在“正在建立账号连接...”
|
||||
- 本地 token 已失效时,前端没有稳定降级到匿名账号
|
||||
- 用户看不到明确的“登录已过期”提示,只会感觉页面卡住
|
||||
|
||||
## 目标
|
||||
|
||||
本次热修只处理登录恢复链路,不扩散到其他运行时模块:
|
||||
|
||||
- 本地 token 登录失败或超时后,自动清理失效 token
|
||||
- 立即改走匿名连接,恢复页面可用性
|
||||
- 在进入匿名账号后给出一次明确提示:登录已过期,已切换为匿名账号
|
||||
|
||||
## 落地方案
|
||||
|
||||
### 1. 账号恢复层增加 token 失效回退
|
||||
|
||||
文件:
|
||||
|
||||
- `src/services/authService.ts`
|
||||
|
||||
调整点:
|
||||
|
||||
- `getCurrentAuthUser()` 底层恢复流程增加 `recoveryNotice`
|
||||
- 当浏览器本地存在 token 时,首次建连增加短超时保护
|
||||
- 若首次建连失败或超时:
|
||||
- 断开当前 Spacetime 连接
|
||||
- 清空本地 access token
|
||||
- 重新以匿名身份建连
|
||||
- 匿名建连成功后,返回 `login_expired` 恢复结果给 UI
|
||||
|
||||
### 2. 认证门面增加非阻塞提示
|
||||
|
||||
文件:
|
||||
|
||||
- `src/components/auth/AuthGate.tsx`
|
||||
|
||||
调整点:
|
||||
|
||||
- `AuthGate` 成功恢复到匿名账号后,展示顶部轻量提示条
|
||||
- 文案为“登录已过期,已切换为匿名账号。”
|
||||
- 提示条会自动收起,也允许用户手动关闭
|
||||
- 不阻断页面继续进入主内容
|
||||
|
||||
## 验证
|
||||
|
||||
已完成:
|
||||
|
||||
- `npx vitest run src/services/authService.test.ts src/components/auth/AuthGate.test.tsx`
|
||||
- `npm run check:encoding`
|
||||
|
||||
新增覆盖:
|
||||
|
||||
- 本地 token 连接卡住时,会自动回退到匿名账号
|
||||
- 匿名回退成功后,页面会显示“登录已过期”提示
|
||||
|
||||
## 备注
|
||||
|
||||
- `npm run typecheck` 当前仓库仍存在其他模块的存量报错,本次热修没有继续扩散处理
|
||||
- 本次已消除本热修涉及文件新增的类型问题,剩余报错集中在 `storageService`、`CustomWorld*` 与 `runtimeStoryService.test.ts`
|
||||
63
docs/technical/SPACETIME_DEV_URI_HOTFIX_2026-04-20.md
Normal file
63
docs/technical/SPACETIME_DEV_URI_HOTFIX_2026-04-20.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# Spacetime 开发连接地址热修 2026-04-20
|
||||
|
||||
## 背景
|
||||
|
||||
当前前端账号、存档和资料库链路已经切到 SpacetimeDB。
|
||||
|
||||
但本地开发默认配置存在一处关键错配:
|
||||
|
||||
- 默认数据库名是 maincloud 上的 `xushi-p4wfr`
|
||||
- 默认 `VITE_SPACETIME_URI` 却写成了 `ws://127.0.0.1:3000`
|
||||
- 同时 `npm run dev` 的 Vite 开发服也默认占用 `127.0.0.1:3000`
|
||||
|
||||
结果是页面启动后,浏览器会把账号 WebSocket 误连到 Vite,而不是实际的 SpacetimeDB 服务。
|
||||
|
||||
这会直接表现为:
|
||||
|
||||
- 页面长时间停留在“正在建立账号连接...”
|
||||
- 或者账号连接相关逻辑异常,但 `npm run dev` 终端表面上看起来前后端都已经启动
|
||||
|
||||
## 根因
|
||||
|
||||
本次问题不是 `server-node` 编译失败,而是前端默认环境变量错误:
|
||||
|
||||
- `src/spacetime/client.ts` 内置默认 URI 错误
|
||||
- `.env.example` 示例值错误
|
||||
- `scripts/dev-node.mjs` 没有把正确的 Spacetime 默认值显式注入启动环境
|
||||
|
||||
## 修复
|
||||
|
||||
本次做了三处最小修复:
|
||||
|
||||
1. `src/spacetime/client.ts`
|
||||
|
||||
- 默认 `VITE_SPACETIME_URI` 改为 `wss://maincloud.spacetimedb.com`
|
||||
- 默认数据库名继续保持 `xushi-p4wfr`
|
||||
|
||||
2. `scripts/dev-node.mjs`
|
||||
|
||||
- 当本地未配置时,自动注入:
|
||||
- `VITE_SPACETIME_URI=wss://maincloud.spacetimedb.com`
|
||||
- `VITE_SPACETIME_DATABASE_NAME=xushi-p4wfr`
|
||||
- 启动日志增加当前使用的 Spacetime URI 和数据库名,便于排查
|
||||
|
||||
3. `.env.example`
|
||||
|
||||
- 示例值改为 maincloud URI
|
||||
- 补充说明:若要连本地 `spacetime start`,需在 `.env.local` 中显式覆盖为 `ws://127.0.0.1:3000`
|
||||
|
||||
## 验证
|
||||
|
||||
已完成:
|
||||
|
||||
- `npm run dev`
|
||||
- Vite 正常启动到 `http://127.0.0.1:3000`
|
||||
- `server-node` 正常启动到 `:8081`
|
||||
- 启动日志会明确打印当前 `VITE_SPACETIME_URI` 与 `VITE_SPACETIME_DATABASE_NAME`
|
||||
- `npm run check:encoding`
|
||||
|
||||
## 结论
|
||||
|
||||
默认开发链路现在会优先连到和默认数据库名一致的 maincloud Spacetime 服务,不再把账号连接误打到本地 Vite 端口。
|
||||
|
||||
如果后续要切回本地 SpacetimeDB,只需要在 `.env.local` 中显式覆盖 URI,不需要再改代码。
|
||||
Reference in New Issue
Block a user