我遇到了一个间歇性问题:编辑后的帖子能够成功保存,但在 iOS 上的 DiscourseHub 中,已经渲染的帖子有时仍显示旧内容,直到我刷新该主题。
环境
生产站点是我自己自建的 Discourse 安装实例,我将其作为个人学习档案私有使用。
今天我复现此问题时,环境如下:
- 客户端: iPhone 上的 DiscourseHub
- iOS 版本: 27.0.1
- 生产环境 Discourse 版本:
v2026.10.0-latest +112 - 站点类型: 自建,私有学习档案
- 默认 iOS 浏览器: iCab Mobile
由于一个无关的本地下载问题,我将默认浏览器更改为 iCab Mobile。然而,这次复现是在我在 DiscourseHub 内部使用 Discourse 站点时发生的,而不是在打开外部浏览器之后,因此我目前认为默认浏览器的选择与此无关。
实际工作流程
我注意到此问题的主题包含大约 50 个帖子,代表课程幻灯片。
我通常的工作流程是:
- 创建一个包含课程幻灯片图片的帖子;
- 稍后按顺序处理该主题;
- 编辑每个现有帖子;
- 在已发布的幻灯片图片下方添加 OCR 转录文本/笔记;
- 按下保存编辑(Save Edit)并继续处理下一张幻灯片。
因此,这些并不是合成的高速编辑:这是一个正常的学习工作流程,我正在逐步为课程幻灯片图片帖子添加 OCR 转录文本。
对于该主题中较早的帖子,按下保存编辑后,显示的帖子立即被新编辑的内容替换,符合预期。
在同一主题的后期,我遇到了以下情况:
- 我编辑了帖子并添加了 OCR 文本。
- 按下保存编辑。
- 编辑成功保存。
- DiscourseHub 中显示的帖子仍保留其先前内容。
- 刷新页面后立即显示了已保存的编辑内容。
因此,编辑本身似乎已经成功。过时的部分似乎是帖子的已加载客户端表示。
开发测试
然后,我从当前的上游 main 分支创建了一个完全干净的开发实例:
833e1576d47 DEV: Update README.md note on self-hosting (#44320)
我生成了一个包含 60 个帖子的主题,每个帖子中都有一张图片,以模拟生产主题的结构。
然后,我在 Linux 上的 Firefox 中重复了该工作流程,将文本编辑到现有的图片帖子中。
在第一次测试中,我最初在帖子 19 附近看到了一个可能的过时更新。
然而,在更仔细地重复实验后——包括创建一个全新的 60 帖子主题并按顺序编辑帖子——我无法在当前的 main 分支上的 Firefox/Linux 中复现生产环境的行为。
那里的编辑在按下保存编辑后立即重绘了帖子,包括远超主题中第一组帖子的部分。
这让我对主题分页或正常的 20 帖子流块本身是原因这一观点的信心降低了。
下一步测试
生产环境的复现是在 iOS 上的 DiscourseHub 中,而不是主屏幕 PWA。
因此,我计划进行的下一个对比是:
- 当前的上游 Discourse 开发实例;
- 相同的 60 帖子图片主题;
- 同一台运行 iOS 27.0.1 的 iPhone;
- 首先使用 DiscourseHub;
- 在同一台 iPhone 上使用 Safari 作为对照;
- 可选地将主屏幕 Web 应用作为另一个对比;
- 使用相同的 OCR 风格工作流程按顺序编辑帖子。
目前我的开发笔记本电脑连接在 eduroam 上,因此直接将其本地开发服务器暴露给 iPhone 并不简单。
在 DiscourseHub 中在同一台 iPhone 上运行当前 main 分支的开发实例,是否是缩小问题范围的下一步正确操作?
如果是,Discourse 团队是否有首选的方式来将本地开发实例暴露给 iPhone / DiscourseHub 进行测试,理想情况下是通过 HTTPS?
在下一次发生时,我也可以让过时的帖子保持未刷新状态并捕获屏幕录制,以便可以直接将成功的保存/服务器状态与已打开的 DiscourseHub 客户端显示的内容进行比较。
可能相关的观察
从高层次来看,这种行为与我之前在处理 PR #43285,“在主题列表中刷新事件日期” 时遇到的过时客户端状态问题相似。
那是不同的代码路径,我并不是说它是同一个 bug。
然而,可观察到的故障是相似的:服务器端状态可能是正确的,而已加载的客户端继续显示过时状态,直到相关的刷新/重新水合发生。
对于事件日期问题,我能够根据时序在不同的已打开客户端上观察到 A/B 情况。
这让我怀疑这个编辑问题是否也位于通知/模型更新/渲染链中的某处,而不是编辑本身失败。