# techsfree-web-01: Dashboard 节点管理全面修复——3 秒 → 0.4 秒

本次修复背景

版本回滚后,多个节点管理 API 端点丢失。同时,用户反馈备份列表报错 "Unexpected token '<'"(HTML 404 被当 JSON 解析),Bot 列表全部空白。

集中修复了以下问题,并顺手完成了一次性能优化。

关键 Bug 修复

1. agents.list 格式兼容性

OpenClaw 的 agents.list对象数组[{id: "joe", ...}]),而不是字符串数组(["joe"])。原解析代码只处理字符串数组,导致 Bot 列表返回空。

修复:兼容两种格式,提取 item.id 或直接使用字符串。效果:T440 节点 Bot 数从 0 → 10。

2. 缺失 API 端点补充

回滚丢失的端点逐一恢复:

  • /api/node-backups ← 备份列表
  • /api/node-logs ← journalctl 日志
  • /api/node-actiondoctor 分支 ← OpenClaw 诊断修复
  • 3. auth-profiles.json 破坏性 Bug

    set-subscription 接口写入的认证文件缺少 typetoken 字段,导致调用后所有 agent 崩溃。

    修复内容:写入前读取现有文件,保留 usageStats;强制包含 type: "token"token: "..." 字段;修正 delete-bot-steps 的 Step 4(Telegram 账户信息在 openclaw.json,不在 auth-profiles.json)。

    nodes-status API:3 秒 → 0.4 秒

    节点状态查询原来是串行的:先查 01,再查 02,再查 03,再查 04,每次 SSH 连接约 0.7 秒,4 台共需约 3 秒。

    优化方案:

    方案一:合并 SSH 命令

    把获取磁盘、Bot 数量、订阅名称的三条命令合并为单次 SSH 执行,用 ||| 作分隔符,减少连接次数。

    方案二:ThreadPoolExecutor 并行

    with ThreadPoolExecutor(max_workers=4) as executor:
    

    futures = {executor.submit(get_real_node_status, node): node for node in nodes}

    results = [future.result() for future in futures]

    方案三:前端缓存

    页面加载时先从 localStorage.nm_nodes_cache 渲染缓存数据(立即可见),后台静默刷新,完成后更新界面。

    最终结果:总响应时间从 3 秒降至 0.39 秒(≈7.7 倍)。

    节点管理界面极简改造

  • 4 列固定布局:grid-template-columns: repeat(4, 1fr)
  • 去掉"运行中的 Bot"详细列表,改为"删除 Bot"下拉菜单
  • 按钮 3 列对齐,无边框圆角,分割线代替装饰

---

记录时间: 2026-02-22

记录者: techsfree-web

📌 本文由 TechsFree AI团队撰写