🧠 20251009智能体项目的实战 Debug 复盘

173 阅读3分钟

💻 一、背景

项目涉及 Spring Boot + PostgreSQL + Redis + Docker + Vue 前端 等多模块架构。

今天原本只是想顺手测试一个知识迁移功能,
结果一连串报错、空白页、Docker 错误把我打了个措手不及——
于是,就有了这场「从白屏到顿悟」的调试历险记 😭。


🚧 二、今日遇到的问题清单

序号问题描述现象影响
1️⃣Docker 启动失败no configuration file provided: not found无法启动 MySQL/Redis 等基础服务
2️⃣Windows Docker 环境疑惑不确定 Win10 是否能跑 Linux 镜像项目部署中断
3️⃣页面白屏注释路由守卫后前端无法渲染Vue Router 初始化错误
4️⃣数据迁移报错控制台报错 ERROR: syntax error at or near ")"后端逻辑异常,知识迁移失败

🧩 三、逐个击破的过程

🧱 1. Docker 启动失败:文件缺失导致的空命令

错误提示:

no configuration file provided: not found

原来我在路径
data/linux/docker/
下运行了 docker-compose up
但这里根本没有 docker-compose.yml 文件,只有一个孤独的 Dockerfile

👉 解决方案:

  • 确认 docker-compose.yml 是否存在于项目根目录;

  • 若没有,需自行补写或手动启动容器;

  • 例如:

    docker run -d --name redis redis
    docker run -d --name postgres -e POSTGRES_PASSWORD=123456 postgres
    

🐧 2. Windows 10 能跑 Linux 容器吗?

这是很多人容易误解的点。
其实 Windows Docker Desktop 是靠 WSL2 子系统 跑的 Linux 内核。

结论:完全能跑,只要:

wsl --install

然后确保 Docker Engine 后端选择 WSL2


🌐 3. 页面白屏:Vue 路由守卫误删导致空路由

我一开始注释了这段:

router.beforeEach((to, from, next) => {
  if (to.meta.requireAuth) {
    if (store.state.token) next()
    else next({ path: 'login', query: { redirect: to.fullPath } })
  } else {
    next()
  }
})

结果前端直接一片白,
DevTools 里只剩下:

<div id="app"></div>
<!-- built files will be auto injected -->

原因其实很简单:
路由守卫是 Vue 启动逻辑的一部分,完全注释会导致 Vue Router 实例失效。

👉 解决方案:

  • 不要删除守卫,而是 在开发环境下跳过校验

    if (process.env.NODE_ENV === 'development') {
      console.log('🚀 开发环境跳过鉴权')
      next()
    } else {
      // 原逻辑
    }
    

🧠 4. PostgreSQL 报错:IN() 空括号引发的 SQL 语法错误

控制台滚了一屏:

ERROR: syntax error at or near ")"
位置:83
### SQL: UPDATE public.knowledge_question
SET dataset_id=? WHERE (question_id IN ())

原因是:

  • 查询得到的 questionIds 是个空列表;
  • 最终 SQL 拼接成了 IN ()
  • PostgreSQL 看到这空括号就懵了 😵。

👉 解决方案(Java 层防御式编程):

if (questionIds == null || questionIds.isEmpty()) {
    System.out.println("⚠️ 无 questionId 需要更新,跳过执行 SQL");
} else {
    KnowledgeQuestionEntity questionEntity = new KnowledgeQuestionEntity();
    questionEntity.setDatasetId(transferDatasetVo.getDatasetId());
    knowledgeQuestionMapper.update(
        questionEntity,
        new QueryWrapper<KnowledgeQuestionEntity>().in("question_id", questionIds)
    );
}

修复后再次运行:

⚠️ 无 questionId 需要更新,跳过执行 SQL

✅ 程序不再崩溃,功能正常。


🧩 四、今日关键收获

技能点收获
🧱 Docker Compose明白 docker-compose.yml 是容器编排的关键文件
🧠 SQL 防御空集合一定要判断,否则 IN() 会炸
🧩 调试技巧从异常堆栈可精准定位出错文件与行号
🐧 Docker on Windows实际运行在 WSL2 Linux 内核上
🧭 前端路由Vue 路由守卫不要轻易注释,可加开发模式分支逻辑

🛠 五、最终成果

✅ 后端逻辑修复成功
✅ PostgreSQL 报错消除
✅ 前端页面正常加载
✅ Docker 环境理解到位
✅ 智能体项目可以正常运行与测试


💬 六、复盘小结

今天一整天的调试像是一场“系统集成实战训练”:
从 Docker、数据库、后端到前端,每一步都踩过坑。
但正是这些坑,让我更清楚地理解了 项目结构、异常定位、SQL 拼接 的底层逻辑。