错误:出现问题 - “处理路由时出错:discovery.categories”

一名管理员用户在更新 Discourse 后遇到了一个奇怪的错误。当用户点击“返回”按钮或站点徽标时会出现该错误。它似乎触发了跳转到站点根目录/首页的 JavaScript,但却引发了以下错误:

视觉上错误显示为:

在 JS 控制台中:
console

我还发现,点击任何导航栏链接(例如尝试访问 /admin)也会出现此问题。

对于如何进一步追踪此问题有什么建议吗?在 production.log 或其他地方都没有看到错误,这真让人困惑,因为它似乎与 JavaScript 绑定。

您是否尝试过如何使用 Discourse 安全模式

感谢您的建议。奇怪的是,即使在安全模式下启用了全部 3 个选项,错误仍然存在:

到目前为止,在进一步调试时仍然遇到死胡同。我怀疑“安全模式”未能完全禁用 JavaScript,因此……是否有其他步骤可以进一步在测试中排除 JavaScript 的功能?

您的网站是否公开可访问?如果是,方便分享一个链接吗?(如果您不希望公开张贴,通过私信发送也可以)

感谢提供链接 @mreach。从这边看,我没有发现任何明显的问题。

您提到这仅影响网站上的一个用户。您是否知道该问题是否仅限于单个浏览器或设备?或者即使用户使用不同设备登录,该问题是否依然会出现?

如果是仅在一个浏览器或设备上发生,这可能表明某个浏览器插件(例如广告拦截器)干扰了 Discourse 的代码。

如果该问题在所有浏览器中都会出现,那就更为棘手。您的论坛是否安装了任何第三方插件?此外,了解该用户在其 Discourse“界面”偏好设置中配置的“默认主页”是什么,也会很有帮助。

谢谢——是的,我大多也有同样的想法。我让他们尝试禁用所有扩展并清除所有浏览器数据。刚刚又有另一位用户报告了相同的问题……而且他们都使用 Chrome。我让他们尝试 Firefox 和 Brave,他们都说在那里可以正常工作,但他们尝试的任何方法都无法让 Chrome 再次“正常”工作。我又询问了他们关于无痕模式的结果,两人都表示无痕模式确实可以正常工作。再次强调,所有这些情况都发生在最近的 Discourse 更新之后,因此似乎某些 JavaScript 内容未能被正确清除……这确实让我难以理解为何会如此。

我已经询问了他们将什么设置为主页……有结果后会告知您。这是一个非常好的建议,我之前完全没有想到。

1 个赞

好的,有趣但尚无定论:

出现问题的用户将其主页设置为“分类”:
image

如果他们将主页更改为其他选项,例如“最新”,则可以通过点击站点徽标以及使用浏览器中的“返回”箭头来加载主页。如果他们将主页从“最新”改回“分类”,问题/错误就会再次出现。:weary_face:

此外,该用户也是管理员。当他们点击右上角的汉堡菜单图标并点击“管理”时,即使将主页从“分类”更改为“最新”,也会出现上述错误。

当然,这是新信息,但从我目前的角度来看,帮助不大。嗯。

1 个赞

您能否提供更多关于这些错误的详细信息?它们应该都可以展开,并且希望能包含更多关于错误的细节。

他们给了我以下控制台输出:https://pastebin.com/LuDHesyQ

再次感谢大家到目前为止的建议——@david,你对此有什么看法吗?

1 个赞

恐怕不行——这些日志相当通用,似乎没有说明实际原因。

最有趣的日志是您上面分享的截图中最顶部的那一条,同时也是 pastebin 中的最后一条记录:

domainname.com/:1 Uncaught (in promise) {readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}

了解 ... 中的内容可能会有所帮助。如果您点击日志左侧的小三角形,它应该会展开以显示更多信息。复制/粘贴或截图可能会有所帮助。

另外,您是否看到任何服务器端错误(在 /logs 处)?您是否运行的是最新版本的 Discourse?

是的,正在运行最新版本。我在错误发生期间检查了日志,在生产环境或其他地方都没有发现任何异常……

嗯,他们在该行执行了复制对象操作,结果如下:

{
    "readyState": 4,
    "responseText": "<!doctype html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"refresh\" content=\"30\">\n        <title>domainname.com 维护中</title>\n        <style>\n\t    html {\n\t        background: #3d4147;\n\t    }\n            .center {\n                display: flex;\n                justify-content: center;\n            }\n            .container {\n                background: #717984;\n                max-width: 500px;\n                padding: 5px 50px 30px 50px;\n                margin-top: 20px;\n            }\n            .title {\n                padding-top: 20px;\n            }\n            h1, p {\n                font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n            }\n            @keyframes spin {\n                from { transform: rotate(0deg); }\n                to { transform: rotate(360deg); }\n            }\n            .spinner {\n                animation: spin 10s infinite linear;\n                height: 75px;\n                width: 75px;\n                border: 7px solid #555555;\n                border-right-color: transparent;\n                border-radius: 50%;\n                margin-top: 20px;\n            }\n        </style>\n    </head>\n    <body>\n                <div class=\"center\">\n                    <img src=\"/err/site.png\" alt=\"site logo image\" width=\"512\" height=\"171\">\n                </div>\n        <div class=\"center\">\n            <div class=\"container\">\n\t\t<center>\n                  <h1 class=\"title\" >我们暂时正在进行维护……</h1>\n\t\t</center>\n\n                <div class=\"center\">\n                    <img src=\"/err/error.png\" alt=\"maintenance image\" width=\"150\" height=\"152\">\n                </div>\n\n\t\t<center>\n                  <p>domainname.com 目前正在进行维护。我们要么正在升级网站,要么正在执行计划内的维护。</p>\n\t\t  <p>为了方便您,我们已设置此页面在系统恢复可用时自动刷新!</p>\n                  <p>非常感谢您的耐心。</p>\n\t\t</center>\n\t\t\n                <div class=\"center\">\n                    <div class=\"spinner\"></div>\n                </div>\n            </div>\n        </div>\n    </body>\n</html>\n",
    "status": 200,
    "statusText": "parsererror"
}

以及从控制台截取的截图:

@david 这就是您提到的内容吗?我们希望我们已捕获了正确的结果。

您是否在代理后面运行 Discourse?我相当确定这条维护消息并非来自 Discourse 本身:thinking:

这是一个错误页面实现,当网站正在进行维护(例如升级或 Docker 更新)时渲染该页面……

我猜您的网站在发生错误时并未进行计划内的维护?如果是这样,那么该代理的实现或配置一定存在问题。为了排除这种可能性,您能否将 Discourse 直接暴露在 80/443 端口上?(根据我们的标准安装说明

当然,也有可能是 Discourse 中的错误导致代理显示了此消息。但在不了解 Discourse 返回内容的情况下,很难对此进行诊断。您的代理是否保留了上游 Discourse 响应的日志?