Zotero 官方问题报告:根节点「将所有订阅标记为已读」静默失效

B. 中文版 — 可直接贴 Zotero 官方论坛
标题

【缺陷】订阅根节点「将所有订阅标记为已读」遇到空订阅后静默中断,其后所有订阅永远清不掉

正文

环境:Zotero 10.0.6(中文界面),Windows 11(build 26200)。已确认与插件无关(停用全部插件、故障排除模式、完整重启均复现)。

现象:右键「订阅」根节点 →「将所有订阅标记为已读」时,只有 libraryID 小于第一个空订阅(0 条目)的那些订阅会被标记;排在空订阅之后的所有订阅,无论点多少次、重启多少次都不会被标记,界面上也没有任何报错。

复现步骤

订阅至少三个 RSS,让它们抓到条目;
让其中一个订阅变成 0 条目(例如抓取失败 lastCheckError = 'Processing failed',且已读条目又被 cleanupReadAfter 清掉),记下它的 libraryID(不能是最大的那个);
确保某个 libraryID 更大的订阅有未读条目;
右键「订阅」根节点 →「将所有订阅标记为已读」;
结果:libraryID 较小的订阅被标记,较大的完全没动,反复点击无效。
数据库证据:我库中一次点击写入了 992 条新的 readTime,这 992 条恰好属于 libraryID 2–15 的订阅,libraryID ≥ 16 的订阅一条未动;而全库只有 两个 0 条目订阅:libraryID = 16 与 libraryID = 24。截断点 15|16 正好落在第一个空订阅上。更早的一次点击(13:09:46)曾完整成功过——那时 16 和 24 还有条目。

根因(代码):chrome/content/zotero/zoteroPane.js:3097 的 markFeedRead 用 for (let feed of Zotero.Feeds.getAll()) 遍历全部订阅,而 Zotero.Feeds.getAll()(chrome/content/zotero/xpcom/data/feeds.js:297)按 libraryID 升序返回;循环体内 Zotero.FeedItems.getAll()(继承自 chrome/content/zotero/xpcom/data/items.js:122)对空库返回 [],紧接着 Zotero.FeedItems.toggleReadByID(chrome/content/zotero/xpcom/data/feedItems.js:130)在数组为空时 throw new Error("No ids passed") —— 于是循环在第一个空订阅处抛错中断,其后的订阅全部被跳过。该异常在 oncommand: () => this.markFeedRead()(zoteroPane.js:3854)处无人捕获,所以界面上毫无提示。

为何单订阅右键一直好用:单订阅走同一个三元表达式的另一分支 rows.map(row => row.ref),只处理被选中的那一个,不经过全量循环。

建议修复:循环内跳过空订阅——

js


for (let feed of feeds) {
let feedItemIDs = await Zotero.FeedItems.getAll(feed.libraryID, true, false, true);
if (!feedItemIDs.length) continue;
await Zotero.FeedItems.toggleReadByID(feedItemIDs, true);
}
临时规避:把 0 条目的订阅刷新回来或退订;或逐个订阅右键「标记为已读」;或在 Zotero 关闭时对 feedItems 表执行 UPDATE feedItems SET readTime = WHERE readTime IS NULL。

C. 提交指引
首选:Zotero 官方论坛 — https://forums.zotero.org/ ,板块选 Zotero(官方要求 bug 先发论坛,开发者会看;用 B 部分中文版,或 A 部分英文版)。
或者 GitHub issue — https://github.com/zotero/zotero/issues/new ,用 A 部分英文版(标题+正文)。
两处都发也可以:论坛帖里附上 GitHub issue 链接,反之亦然。
报告里不需要附你的文库内容或账号信息;上文已确认不含个人数据。
如果对方要求提供调试信息,Zotero 里用 帮助 → 调试日志 → 查看输出日志(需按住 Shift 点「帮助」才会出现),或在「运行 JavaScript」里执行验证脚本把输出贴上去。
Sign In or Register to comment.