管理侧边栏不见了

大家好,

大约两个月来,我左侧的管理员侧边栏一直缺失(见截图)。无论是在设置中还是其他地方,我都找不到“启用”它的选项。即使在隐身浏览器窗口中使用,也显示相同的错误现象。
你们中有人知道这可能是什么原因吗?

致以最诚挚的问候
Mr. Xurrent

欢迎来到论坛 :wave:

你有没有试过安全模式?这可以排除问题是否由插件或组件引起。
你也可以查看浏览器控制台是否有错误信息。

大家好,

我刚才碰巧试了一下,通过“安全模式”可以显示管理员侧边栏。
你能告诉我可能是哪个插件或组件导致了这个问题吗?

为了缩小范围,你可以先在安全模式下禁用插件,然后再禁用主题。这样你就知道该从哪里查起了。

通常情况下,这两项都在管理侧边栏里——现在你又能看到它了。插件有一个单独的版块。你也可以在论坛网址后面加上 /admin/plugins。主题可以在“外观”版块找到,或者访问 /admin/config/customize/themes。

这很可能是针对你论坛的特定定制,因为到目前为止,我还没听说过其他论坛有类似问题。如果不清楚你使用了哪些非 Discourse 官方团队开发的插件、哪些主题组件以及哪些自定义修改,就很难猜测出原因。

1 个赞

仅启用了由 Discourse 团队自行发布的插件。
我已禁用所有插件——问题依旧存在。

当前使用的是“Foundation”主题,无论我查看哪个主题的预览,左侧的管理员侧边栏均缺失。

未安装任何组件。

你是否已经通过安全模式的各种选项,排查出是主题问题还是插件问题?

我刚刚测试过了。
如果我只启用“让过时的 JavaScript 函数引发错误”这一选项,即使在“安全模式”下也会出现相同的错误现象。

你有没有在浏览器控制台中查看过错误?

1 个赞

这并不让我感到惊讶,因为插件和主题都没有被禁用。但这并没有回答问题是出在主题还是插件上。

如果你只禁用主题,侧边栏能正常工作吗?

如果是这样,我们就可以排除插件是原因。否则,我会系统地继续操作,禁用非官方插件。

如果这也不起作用,那就只剩下第3个选项了。

对于这类问题,这样做就够了吗?还是每轮都需要重新构建?

这正是我前面提到的意思。
也就是说,一方面,我逐个禁用了所有插件(但这并没有改变错误现象);另一方面,无论我禁用上述三个选项中的哪一个,在“安全模式”下,左侧的管理员侧边栏都会显示出来。

如果我启用“让过时的 JavaScript 函数引发错误”选项,在“安全模式”下,左侧的管理员侧边栏就不会再显示出来。

嗯。这很不寻常。我原本预期会是二选一的情况。因此,问题要么出在插件与主题之间的交互上,要么两者皆非。
我认为现在查看浏览器控制台确实会有所帮助。

那里向我显示了两个错误:

  1. admin-sidebar.js:378 Uncaught (in promise) TypeError: n.admin_config_login_routes.map 不是函数
  2. api-sections.gjs:23 Uncaught (in promise) TypeError: 无法读取未定义的属性(读取 ‘map’)

1 个赞

太好了!这里可以看到问题出在哪一行代码。

这段代码似乎是解决该问题的方案 Changing the target audience of Enable form templates incorrectly creates an Update Discourse option in the left sidebar - #2 by zogstrip

1 个赞

那里列出的错误并没有反映出我遇到的错误情况。
此外,通过这篇帖子,我还是不明白具体需要修改什么才能让它重新正常工作 :sweat_smile:。

我怀疑你的问题源于为了解决链接中提到的问题而所做的更改。我不确定你是否能在这里做出任何改变。希望有更多代码经验的人能尽快有时间查看一下。

1 个赞

你好 @Mr.Xurrent,我一直在尝试在本地复现该问题,但无论我的插件如何配置,都无法复现。你说只有团队发布的插件被启用,但你是否安装了其他处于禁用状态的插件?

此外,当看到错误时,能否在控制台运行以下代码并将结果粘贴到这里:

(() => {
  const raw = JSON.parse(
    JSON.parse(document.querySelector("#data-preloaded").textContent).site
  ).admin_config_login_routes;

  const live = Discourse.__container__
    .lookup("service:site")
    .admin_config_login_routes;

  return {
    raw,
    rawType: typeof raw,
    rawConstructor: raw?.constructor?.name,
    rawIsArray: Array.isArray(raw),

    live,
    liveType: typeof live,
    liveConstructor: live?.constructor?.name,
    liveIsArray: Array.isArray(live),
    liveHasMap: typeof live?.map === "function",

    arrayPrototypeHasMap: typeof Array.prototype.map === "function",
  };
})()

此时我真的不确定你为何会获取到一个不支持 map 方法的 admin_config_login_routes 值。当我在服务器上使用 LOAD_PLUGINS=0 禁用所有插件时,我得到的是一个空数组。在其他所有情况下,我得到的都是一个包含值的数组。两者都支持 map 方法,但如果数组外部出现类似 {} 或 "oauth2" 这样的值,则会触发该错误。

1 个赞

你好 @tannerabread ,

没错,当时只有 Discourse 自身发布的插件处于启用状态——没有安装其他任何插件。

我在浏览器控制台中输入了你提到的那段代码,但情况没有任何变化,浏览器控制台也没有给出任何反馈。

“OAuth2”插件从未被启用过。

为了澄清一下,我本来并不指望那段代码会改变什么——但我期望能看到某种输出,即使值是 null 或 undefined。

还有一点,除非应用通过以 LOAD_PLUGINS=0 启动服务器来显式卸载所有插件,否则插件是否启用不应该影响它是否包含在 admin_config_login_routes 中。


我让你运行那个控制台代码块,是希望能看到 admin_config_login_routes 的值(或缺失的值)。它不应该是空的,即使是空数组也应该能正常工作于 map 函数。

这些主要是我的一些想法,我会再仔细想想我们可以如何查明这个问题。如果能看到更多你的配置情况就好了,尽管你说你只安装了官方的 Discourse 插件。

我想一个很好的问题是:你安装的插件是否都是核心 Discourse 自带的默认插件,还是你也安装了一些来自 Discourse 的额外插件?

1 个赞