Discourse评论卡在“正在加载...”

您好,

在过去的几天里,我们在 Discourse 中注意到,“查看完整帖子”按钮在点击时一直显示为“正在加载…”:

此外,新的 Discourse 评论已停止显示在我们 Drupal 网站的嵌入内容中。我们多年来一直成功地使用了下面的 JavaScript 嵌入说明:

然而,不知何故,这似乎最近停止工作了。我相信最后一个有效帖子大约在本月 1 号。较旧的帖子在 Discourse 和嵌入模块中都可以显示,但对于较新的文章,Discourse 块只会一直显示“正在加载…”文本。

我们的 Discourse Drupal 模块从以下代码加载:

<div id="discourse-comments">
 <script type="text/javascript">
            var discourseUrl = "https://discourse.sitename.com/",
            discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

            (function() {
              var d = document.createElement("script"); d.type = "text/javascript"; d.async = true;
              d.src = discourseUrl + "javascripts/embed.js";
              (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(d);
            })();
          </script>
 </div>

我已确认“javascripts/embed.js”文件仍然存在于同一路径。
这是文章页面上显示的块;但最近它只显示“正在加载讨论…”:
image

在过去的几年里,我们没有对 Discourse 嵌入或设置做过任何更改。最近 Discourse 的功能是否有任何会破坏此功能的更改?非常感谢您能帮助解决这个问题!

2 个赞

我们在自己的网站上使用了相同的嵌入功能。我猜 discourseUrldiscouseEmbedUrl 不是你上面发布的内容,而是你论坛的相关网址?

否则,代码看起来还可以。我知道嵌入功能对最新的 Discourse Beta 版本是有效的。我们上周已经嵌入了大量的帖子。我觉得奇怪的是,它嵌入了帖子的开头部分,但“显示完整帖子”按钮却不起作用。我们的帖子会立即加载 :thinking:

你检查过控制台是否有错误吗?

你可以尝试禁用 embed_truncate 设置,看看是否能发布全部文本。这可能有助于缩小问题的范围。

您最近是否升级或更改过任何主题?或者您真的意思是多年未升级?

1 个赞

是的,没错,我只是为了清晰起见使用了 sitename 占位符。
哎呀,很高兴听到 Discourse 的嵌入功能没有损坏!一定是我们的问题。

我查看了 Discourse 日志 (discourse.sitename.com/logs),只看到很多如下的弃用通知:

弃用通知:SiteSetting.enable_personal_messages 已被弃用。

我当然可以尝试禁用 embed_truncate,接下来我会查找它。但该功能已经正常工作了很多年,所以我不知道为什么会中断……

2 个赞

尝试在单击“显示完整帖子”按钮时查看开发人员工具控制台中的错误。开发人员工具可以通过右键单击并选择“检查”来访问。错误将显示在右侧的红色文本中。

是的,嵌入功能绝对没有坏。我的网站每天都会出现这种情况。

最新的测试版是 Discourse 3.1.0.beta4,稳定版是 3.0.3: Security and bug fix release

2 个赞

我相信我们的设置已得到管理;我没有对其进行任何更改,但我们的 Discourse 仪表板显示 Discourse 的最后更新日期是 4 月 18 日。查看与该日期相关的最新公告,它似乎是 3.0.3。

1 个赞

确保您也运行的是最新的 Discourse 版本。另外,看看在安全模式下是否也发生同样的情况可能也值得。

你说得对,谢谢!我刚检查了一下,看到了这个错误:

Uncaught DOMException: 指定了无效或非法字符串

postUp embed-application.js:6
onload embed-application.js:36

EventHandlerNonNull* embed-application.js:25

<匿名> embed-application.js:66

[embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js:5](https://conversation.spectrummagazine.org/assets/embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js)

postUp embed-application.js:6
onload embed-application.js:36

(异步:EventHandlerNonNull)

<匿名> embed-application.js:25

<匿名> embed-application.js:66

很奇怪,因为我最近没有对代码做任何更改。不过,我记得本月2号我使用了 Cloudflare 来加强安全;我可能需要检查一下是否有任何可能阻止脚本运行的设置。

上次检查这个问题时,我在开发者工具控制台中看到了一个 CSP 错误,所以这可能是问题所在,可能是在 Cloudflare 端。

1 个赞

我怀疑是这个原因。

我知道当我们的主站修改其在线内容策略和安全设置时,我们的嵌入内容曾被阻止了几天。但效果不同,它阻止的是嵌入内容反向进行,而不是发布到我们的论坛。

1 个赞

哦,说得对!您是否知道必须更改哪个安全设置才能解决此问题?
我做了一些更改,所以不确定具体应该回滚哪一个。

不知道,我不负责网站的那一部分。我不得不打电话给托管他们的人,让他们改回安全策略设置。

是的,点击该按钮似乎有些问题。

我找到了问题所在!我联系了我们的托管 Discourse 支持,他们提供了一个我们之前添加到 WAF 阻止列表中的 IP 地址,因为该地址流量过大。原来,为了让 Discourse 正常通信,必须允许该 IP 地址。我很高兴问题不在 Discourse 端!

5 个赞

是的,听起来和我遇到的问题有点相似。很高兴你解决了它 :slight_smile:

2 个赞

我好像遇到了同样的问题。我的浏览器开发者控制台中出现了这些 DOMException 错误。不过,我没有使用 Cloudflare。嵌入 Discourse 框架的博客托管在 Netlify,Discourse 本身由 Communiteq 提供。

我最初认为这个更改导致了问题:

但现在我认为可能是别的原因?任何帮助都将不胜感激。

您是否可以访问 Netlify 服务器上的安全和/或网络设置?根据我最近的经验,如果我是您,我会检查您的安全设置,看看是否有任何 IP 地址被阻止。我也会与 Communiteq 支持部门再次核实,因为他们或许能够确认您的 Netlify 服务器需要哪些 IP 地址才能与 Communiteq 通信,以成功执行显示 Discourse 资源所需的脚本。

1 个赞

嘿!感谢您的帮助!

我已经联系了 Communiteq。

我不确定在 Netlify 端我能做什么,但我会去调查。不过我怀疑问题出在那里,因为从技术上讲,请求是从我的网站访问者的浏览器发出的,对吧?如果我理解得没错,请纠正我,这是在网站访问者浏览器中执行的客户端 JavaScript。Discourse 看到请求中的服务器主机名,但看不到 IP。我的博客服务器不与论坛服务器通信。它只是一个静态博客安装。它只是带有客户端 JavaScript 的 HTML。它使用一个脚本将博客文章数据发送到 Discourse,并在 iframe 中加载论坛中的内容。

1 个赞

问题确实是最新 Discourse 版本中的一个 bug。Communiteq 正在为我的论坛实例打补丁。更多信息请参见此处:

请注意,此问题有所不同。

此主题中的问题是 Discourse 无法在 Discourse 中“显示完整帖子”,因为嵌入的网站拒绝将博客帖子的内容提供给 Discourse。

@fabsh 主题中的问题是 Discourse 中包含问题的(较新的)安全补丁的结果。

3 个赞

您好,我将对此进行更新,因为我对此问题的调查中发生了一些变化。自更新到 3.0.4 版以来,该问题仍然存在;所有新创建的文章在显示嵌入的 Discourse 代码时都存在问题。在此更新之前创建的所有文章都没有问题,因此这不是 IP 地址阻止导致的问题。

看起来 Discourse 在最新版本中更改了嵌入代码自动创建帖子的逻辑,因此现在新代码需要规范 URL。请参阅之前链接的主题:

但是,这完全破坏了我网站上的嵌入功能。我之前在 Drupal 中使用节点 ID 进行嵌入,如下面的代码所示:

discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

这个新的 Discourse 代码要求改用规范 URL,如果有人简单地重命名文章标题,就会导致创建重复的主题。这就是我使用节点 ID 的原因,因为它不会改变。

是否可以将这个新的规范 URL 设为可选?我尝试更改我的嵌入代码以使用它,但使用旧嵌入代码创建的所有帖子的加载问题又回来了。

因此,目前,在我的生产网站上运行新的 Discourse 代码,我被困在这两个选项之一:

  • Drupal 上新创建的文章显示“正在加载…”但从未加载评论嵌入块;在 Discourse 3.0.4 之前创建的旧文章可以正常加载

或者,

  • Drupal 上新创建的文章可以正常加载评论嵌入块,但所有在 Discourse 3.0.4 之前创建的旧文章都显示“正在加载…”但从未加载评论嵌入块

有没有办法让这个新功能成为可选的?必须在这两个选项之间做出选择,这让我陷入了进退两难的境地。

2 个赞