Repository navigation
[BUG] 移动云盘访问子目录出现根目录套娃情况 #112
Description
请确认以下事项
- 我确认描述清晰有礼貌,已提供必要诊断信息,在最新版本上可以复现。
- 我确认已经查过相关文档和已有问题和讨论,本次反馈并非是重复提问。
- 我确认这是Worker项目问题,并非网络和操作导致,也不是Go版的问题。
- 我确认已阅读开源许可/免责条款/使用政策,理解使用的风险自行承担。
版本(必填)
https://github.com/OpenListTeam/OpenList-Worker/tree/bfb963eeb8d5324b78d4311c22bbb5e67c657342
平台(必填)
Tencent EdgeOne Makers
DB_FORMAT(必填)
map(整对象 JSON)
DB_DRIVER(必填)
blob
存储驱动(必填)
blob
问题描述(必填)
复现步骤:存储为移动云盘的时候,当访问比如/手机软件的时候按逻辑应该出现的是/手机软件文件夹下的文件。而现在的问题是会出现根目录下的所有文件夹。并且有时候点击/手机文件/阅读.apk的时候会出现/手机软件/阅读.apk/阅读.apk这样套娃的情况。
报错信息:正常的情况下的/api/fs/list这个api提交的是{"path":"/手机软件","password":"","page":1,"per_page":20,"refresh":false}返回的应该是{
"code": 200,
"message": "success",
"data": {
"content": [
{
"name": "阅读.apk",
"size": 20485008,
"is_dir": false,
"created": "2026-10-04T19:47:40.056+08:00",
"modified": "2026-10-04T19:47:40.056+08:00",
"sign": "",
"thumb": "",
"type": 0,
"hashinfo": "",
"hash_info": {}
}
],
"total": 1,
"readme": "",
"header": "",
"write": false,
"write_content_bypass": false,
"provider": "139Yun",
"direct_upload_tools": [],
"page_size": 20,
"cache_expiration": 30
}
},但是现在的问题是会出现返回{
"code": 200,
"message": "success",
"data": {
"content": [
{
"name": "手机软件",
"size": 0,
"is_dir": true,
"created": "2026-10-04T19:47:40.056+08:00",
"modified": "2026-10-04T19:47:40.056+08:00",
"sign": "",
"thumb": "",
"type": 1,
"hashinfo": "",
"hash_info": {}
},
{
"name": "电脑软件",
"size": 0,
"is_dir": true,
"created": "2026-10-04T19:47:31.234+08:00",
"modified": "2026-10-04T19:47:31.234+08:00",
"sign": "",
"thumb": "",
"type": 1,
"hashinfo": "",
"hash_info": {}
},
{
"name": "系统相关",
"size": 0,
"is_dir": true,
"created": "2026-10-04T19:57:26.263+08:00",
"modified": "2026-10-04T19:57:26.263+08:00",
"sign": "",
"thumb": "",
"type": 1,
"hashinfo": "",
"hash_info": {}
},
{
"name": "自写软件",
"size": 0,
"is_dir": true,
"created": "2026-10-04T19:46:55.353+08:00",
"modified": "2026-10-04T19:46:55.353+08:00",
"sign": "",
"thumb": "",
"type": 1,
"hashinfo": "",
"hash_info": {}
}
],
"total": 4,
"write": false,
"write_content_bypass": false,
"provider": "139Yun",
"direct_upload_tools": [],
"cache_expiration": 30
}
}这样的情况。
报错信息(必填)
页面无任何报错。
eopages无法看到函数日志。
不知道是不是根据#95 的Alumos修复了eopages无法部署的问题导致的路由出错。
相关配置(必填)
DB_FORMAT = map
DB_DRIVER = blob
JWT_SECRET = 12345678
复现链接(可选)

Activity
wumingzhinu commentedon Oct 8, 2026
版本(必填)
https://github.com/OpenListTeam/OpenList-Worker/tree/bfb963eeb8d5324b78d4311c22bbb5e67c657342,什么版本不是让你填仓库地址,仓库有git,能查看什么时候修改的,修改了什么?
MoForgt commentedon Oct 8, 2026
@wumingzhinu 我修改了的版本是https://github.com/MoForgt/OpenList-Worker/tree/e145f28b73d426aeff26a05c3a757886f1044f60,我是从最新的fork后让ai修改了四个文件,具体修改的文件为https://github.com/MoForgt/OpenList-Worker/commit/e145f28b73d426aeff26a05c3a757886f1044f60。至于为何要后面要带这一长串,而不是https://github.com/MoForgt/OpenList-Worker,是因为我尝试让ai修复这个套娃的bug,结果ai越修问题越多。所以最后恢复到修复完eo pages无法部署之后代码。
wumingzhinu commentedon Oct 8, 2026
那你只能等,因为开发大多数是学生,我提交pr都没通过
MoForgt commentedon Oct 10, 2026
2026年10月10日12:33:24为止,用最新的仓库部署,bug仍然存在,说明不是我用ai修复eo无法部署后出现的bug。
[-][BUG] api返回错误[/-][+][BUG] 移动云盘访问子目录出现根目录套娃情况[/+]PIKACHUIM commentedon Oct 11, 2026
您好,感谢您的反馈,正在定位问题中,似乎和缓存有点关系
PIKACHUIM commentedon Oct 13, 2026
能复现但是定位不到原因,等别的佬看看了
fix(139): 路由 host 缺失与目录 id 缺失不再静默回退根目录 (OpenListTeam#112)
fix(139): 路由 host 缺失与目录 id 缺失不再静默回退根目录 (OpenListTeam#112)
MoForgt commentedon Oct 14, 2026
@wumingzhinu 根据你的https://github.com/wumingzhinu/OpenList-Worker/tree/fix/139-subdir-listing,我不会pr/pull等操作,所以用了最笨的把你的代码下载下来然后重新上传到我的仓库内进行了合并。然后重新部署bug依然存在。以下是截图,如图所示,在我是十点三十一分部署完成的。然后访问了网站,发现/手机软件/阅读.apk无法正常访问。故而有截图,后刷新正常显示了。并且还有/手机软件/手机软件这样的套娃现象,并且eopages并未进行api的缓存,所以不是eo缓存的问题。为方便你们排查问题,网站地址为 https://pan.xrbk.cn
PIKACHUIM commentedon Oct 15, 2026
感谢您的反馈,和eo缓存应该没关系,也并非139云盘独有,但是具体原因还是没定位到...
fix(139): 路由 host 硬失败 + 目录 id 并集回退 + 候选 URL 重试 (#112)
fix(139): 内容级自检 + 候选 URL 扩展,修复 #112 静默返回父级目录
3 remaining items
wumingzhinu commentedon Oct 20, 2026
有点稀奇,我还是直接同步最新的worker部署没有问题
wumingzhinu commentedon Oct 20, 2026
不对啊,我刚部署,可以用移动网盘啊
MoForgt commentedon Oct 20, 2026
这个bug很神奇
wumingzhinu commentedon Oct 20, 2026
分析结论更新(基于 issue 内四张截图 + 版本比对)
一、已经定案的部分
1. 前端无罪。 载荷截图显示请求体
path: "/手机软件"是正确的——前端没有发错路径。2. 后端实锤。 响应截图显示
path=/手机软件返回了200,但 content 是根目录的 4 个文件夹(手机软件/电脑软件/系统相关/自写软件)。path 对了、内容错了,问题在后端链路。3. 套娃机制。 驱动按路径逐段"按名找目录",找到"手机软件"、拿到一个看起来非空的 id,然后拿这个 id 去调 139 的
/file/list。关键在最后一步:139 接口对它不认的 parentFileId 不报错,而是静默返回根目录内容。于是整个链路 200 成功、无任何异常,页面上就是"子目录显示根目录内容"→ 再点进去 →/手机软件/手机软件→ 无限套娃。4. 版本核查(重要)。 报告者基准版(bfb963e,10-08)与当前最新 main 之间,139 驱动的列表代码零变化(只有 #116 token 刷新,与列表无关),
resolveCatalogId的静默回退逻辑至今仍在 main 里原样存在。所以"最新版部署未复现"不代表已修复——最新版多了 #75 目录缓存,正确列表一旦被缓存,偶发的错误回源就被掩盖了;能不能踩中取决于账号数据/路由结果,不是版本。二、还差最后一层:那个"存在但无效"的 id 是怎么来的
只剩三个嫌疑环节,需要一次带日志的复现才能区分:
qryRoutePolicy返回成功,但给的个人云域名上的接口不认parentFileIdtype留空默认按新版个人云走;若账号实际是老版空间/家庭云,接口各说各话三、给 @MoForgt 的两个零成本实验
type设置与 App 里看到的云类型(新版个人云/家庭云)一致四、后续
user_domain_id就会提示;配上user_domain_id即可走 PC 接口自动续期。MoForgt commentedon Oct 20, 2026
MoForgt commentedon Oct 20, 2026
fix: fail-fast on broken JSON body; 139 resolve throws; implement fs …
nike64542-byte commentedon Oct 20, 2026
根因定位:EdgeOne 平台间歇性丢失请求体 + 三层容错缺陷,把"偶发故障"变成"显示根目录"
先说结论:139Yun 驱动和 139 接口本身没有问题(直连 139 API 验证:非法
parentFileId返回明确错误码 04000002/04000010,不会静默返回根目录;mcloud-sign签名错误也不校验,与签名/时区无关)。这个 bug 是一个平台缺陷 + 三层代码容错设计缺陷叠加的结果,任何一层做对,bug 都不会以现在这个形态出现。第 1 层:EdgeOne Functions 间歇性丢失/无法读取 POST 请求体(平台缺陷,触发源)
用同样合法的 JSON(路径唯一、避开缓存、
Content-Type: application/json)对/api/fs/list做探针测试:c.req.text()读取 body 时直接抛异常即 EdgeOne 的 Node 云函数在收到请求时 body 已经被平台弄丢/截断,概率随部署节点在 ~7%~40% 波动。函数侧无法进一步确认平台内部机制(EdgeOne Pages 面板无函数日志可用),需要 EdgeOne 官方函日志才能定论,但"平台丢 body"这一现象可以稳定复现。
第 2 层:
c.req.json().catch(() => ({}))把事故静默降级为"请求根目录"(关键放大器)src/backend/server/fs.ts绝大多数 handler 都是同一模式:于是"平台丢 body"被吞掉后变成
path = "/"→ 返回根目录列表,HTTP 200,页面无任何报错。同时解释了两个现象:第 3 层:139 驱动
resolveCatalogId找不到目录时break静默回退(套娃放大器)src/backend/drivers/139/driver.ts:47-55逐段按名字找目录,找不到就break,返回上层/根catalogId继续列目录:即使第 2 层没触发(手输错误路径、挂载点变更等),错误路径也会"成功"列出上层目录,比如访问
/手机软件/手机软件返回手机软件的真实内容,形成截图里的套娃。PR #121 针对的就是这里。第 4 层:文件树缓存把瞬时故障固化为 30 分钟,用户无法自救
错误的根目录列表会被写入文件树缓存(
ft:{storageId}:{path},TTL 默认 30 分钟);实测站点缓存里就存在错误内容,清空缓存后立即恢复。而前端传的refresh参数后端完全没有实现(全仓库无任何读取),用户点"刷新"无法击穿缓存,只能等 TTL 过期。复现要点
EdgeOne 部署 + 139 存储(挂载点/根目录随意)→ 高频点击子目录 → 一定概率显示根目录内容且无报错;刷新大概率恢复;
/手机软件/手机软件式套娃在缓存内持续 30 分钟。多轮探针 + 损坏 JSON 对照实验可以稳定区分"平台丢 body"与"正常解析"两种分支。wumingzhinu commentedon Oct 20, 2026
我用小号申请了github action ,完成了修复,但是老是failed to read request body,未能解决
fix(139): throw instead of silently break when folder not found in pa…
fix: fail-fast on broken JSON request body; implement fs refresh
fix: fail-fast on broken JSON request body; implement fs refresh (#139)