分享出来,希望能帮别人省下我花掉的时间。我在构建一个基于 Devvit 的 Web 应用(基于 Express,u/devvit/web),它能按计划执行 Reddit 研究,并通过 modmail 和 wiki 页面发送报告。三个问题叠加在一起,导致排查难度远超应有水平:

1. devvit logs 默认会静默丢弃几乎全部日志。
普通的 console.log/console.error 输出似乎被标记为 VERBOSE 级别,除非你加上 --verbose 参数,否则 CLI 会过滤掉它们:

devvit logs r/<subreddit> --verbose

没有这个标志,一个失败(甚至成功)的端点可能产生条可见输出——没有错误、没有成功日志、什么都没有——尽管它已经运行并执行了某些操作。我大部分调试时间都以为代码根本没执行,而实际上它在执行并在报错,只是我看不到。如果你的日志看上去是空的,在假设其他问题之前,先试试 --verbose

2. 新的 devvit.json 条目可能需要一段时间(或者一次 devvit publish,而不仅仅是上传+安装)才能真正生效。
我给已安装的应用添加了一个新的调度任务和一个新的版主菜单项。每次 devvit upload + devvit install 都报告成功,版本号也正确递增,但菜单项和调度任务在相当长一段时间内都没有任何效果——没有错误,就是什么都没发生。最终它确实开始工作了(经过多次重新部署,另外还单独执行了一次 devvit publish --copy-paste……不过我没能完全确定究竟是哪一步触发了生效)。结论:如果新添加的菜单项或调度任务在部署后看起来完全没反应,不一定就是坏了——可能只是需要时间/再部署一次,才能在 Reddit 后端传播开来。

3. reddit.modMail.createConversation() 拒绝任何超过 10,000 字符的 body
结果发现这才是我一直“什么都没发生”症状的根本原因。错误是一个看起来有点通用的 gRPC 失败:

Error: 3 INVALID_ARGUMENT: grpc invocation failed with status 3; Bad request: 
This field must be under 10000 characters
Error in field: body

——直到我修复了第 1 个陷阱才看到这个错误。如果你的报告/摘要文本包含了好几个项目,很容易就超出限制而不自知。解决方法:将 modmail 正文截断到安全字符数以内,如果你需要在别处看到完整内容,可以使用没有此限制的另一渠道(我用了子版块的 wiki 页面,它还有一个好处:通过 /r/<sub>/wiki/<page>.json 甚至允许未经身份验证的请求公开读取)。

TL;DR:在断定任何东西出问题之前,始终先打开 devvit logs --verbose 单单这一个标志就能把我的调查时间从大约 2 天缩短到 20 分钟。

如果大家遇到类似问题,我很乐意回答。

(附注:这个应用运行着 r/TheHonestGut 的每周肠道健康研究机器人——这是一个围绕严谨、有证据分级的肠道微生物组科学数据库建立的小社区。如果你感兴趣,欢迎来打个招呼。)