在开发环境中删除主题时,discourse-events 可能因未初始化的 Calendar::Extractor 导致 500 错误

在本地开发实例中测试一些与主题删除无关的更改时,删除主题返回了 500 Internal Server Error(500 内部服务器错误)。

产生该错误的开发实例运行的是以下确切的 Discourse 提交:

请求如下:

DELETE /t/35

异常来自 discourse-events:post_destroyed 回调:

NameError (uninitialized constant DiscourseEvents::Calendar::Extractor)

plugins/discourse-events/plugin.rb:639:in 'block (2 levels) in Plugin::Instance#activate!'
lib/plugin/instance.rb:676:in 'block in Plugin::Instance#on'
lib/discourse_event.rb:13:in 'block in DiscourseEvent.trigger'
lib/discourse_event.rb:12:in 'DiscourseEvent.trigger'
lib/post_destroyer.rb:91:in 'PostDestroyer#destroy'
app/controllers/topics_controller.rb:818:in 'TopicsController#destroy'

相关的回调似乎正在尝试调用:

DiscourseEvents::Calendar::Extractor.destroy(post)

完整的错误页面报告如下:

NameError (uninitialized constant DiscourseEvents::Calendar::Extractor)

尽管 PostDestroyer#destroy 已经到达触发 :post_destroyed 的位置,但浏览器仍然收到 500 错误,因此删除操作可能在回调抛出异常之前就已经应用了。

这发生在开发环境中。DiscourseEvents::Calendar::Extractor 通常由 events 提供,所以我想知道这是否与开发模式下的重新加载/插件状态有关,而不是实现本身缺失。

当时我正在处理与主题删除无关的代码,但异常本身完全位于 discourse-events:post_destroyed 处理器中。

有没有其他人遇到过 DiscourseEvents::Calendar::Extractor 在开发实例中变为未定义的情况?这是否与开发环境的重新加载/插件状态有关,还是 :post_destroyed 回调应该以不同的方式加载提取器?

1 个赞

感谢您报告此问题。我在本地机器上成功复现了该问题,好消息是它应该只会在开发环境中触发代码重载时出现。

我有一个用于修复开发加载问题的 PR:

https://github.com/discourse/discourse/pull/43359

2 个赞