💻 一、背景
项目涉及 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 拼接 的底层逻辑。