# 生产网站前端出现故障 -- Ember/Test 错误

**URL:** https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704
**Category:** Support
**Created:** [2022年三月23日 02:25 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704 "2022-03-23T02:25:25Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![Mycobee](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mycobee/32/211533_2.png) [@Mycobee](https://meta.discourse.org/u/Mycobee)
#### Post date: [2022年三月23日 02:25 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/1 "2022-03-23T02:25:25Z")

</div>

我的 discourse 实例前端在升级后完全空白且无法加载。这不是个好兆头，我有点恐慌，因为用户们很不满意。后端似乎还在运行。

这发生在今天最新的升级之后，在一个运行容器的 Digital Ocean droplet 上。我使用了 launcher 来重建应用程序。

任何帮助都将深表感谢。

控制台错误显示：

```plaintext
app.js:31
Uncaught TypeError: Cannot read properties of undefined (reading 'registerAsyncHelper') at s.callback (vendor-suffix.js:58:1)
    at s.exports (loader.js:106:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at s._reify (loader.js:143:1)
    at s.reify (loader.js:130:1)
    at s.exports (loader.js:104:1)
    at requireModule (loader.js:27:1)
    at n._prepareInitializer (app.js:24:1)
    at app.js:81:1
    at Array.forEach (<anonymous>)
    at n.start (app.js:73:1)
    at HTMLDocument.<anonymous> (start-app.js:4:1)
    at discourse-boot.js:30:1
    at discourse-boot.js:31:1

```

---

<div class="post-metadata">

### Author: ![Mycobee](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mycobee/32/211533_2.png) [@Mycobee](https://meta.discourse.org/u/Mycobee)
#### Post date: [2022年三月23日 02:26 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/2 "2022-03-23T02:26:21Z")

</div>

所有的 HTML 加载都正常，但 Ember 应用有些地方无法工作……

查看代码中出错的地方，似乎是 `Ember.Application.extend` 因为某种原因抛出了错误

```plaintext
  var Discourse = Ember.Application.extend({
    rootElement: "#main",
    customEvents: {
      paste: "paste"
    },
    Resolver: (0, _resolver.buildResolver)("discourse"),
    _prepareInitializer: function _prepareInitializer(moduleName) {
      var themeId = moduleThemeId(moduleName);
      var module = null;

      try {
        module = requirejs(moduleName, null, null, true);

        if (!module) {
          throw new Error(moduleName + " must export an initializer.");
        }
      } catch (error) {
        if (!themeId || (0, _environment.isTesting)()) {
          throw error;
        }

```

罪魁祸首似乎是这个条件：`!themeId || (0, _environment.isTesting)()`

---

<div class="post-metadata">

### Author: ![Mycobee](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mycobee/32/211533_2.png) [@Mycobee](https://meta.discourse.org/u/Mycobee)
#### Post date: [2022年三月23日 03:17 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/3 "2022-03-23T03:17:40Z")

</div>

哎……原来是个插件……不确定是哪个，但在一番摸索后，我怀疑可能是个问题……移除了 cakeday、signatures、[data explorer](https://meta.discourse.org/t/32566?silent=true)、discourse-video-upload 和 encryption。稍后我会逐个引入它们，看看能否找出罪魁祸首。但目前，应用程序已恢复运行，我不会再碰它了。

糟糕的体验。现在感觉很内疚……将来升级时可能应该有一个暂存克隆过程。吸取教训了。或者至少我会在升级前始终进行快照，以便在失败时进行恢复。

---

<div class="post-metadata">

### Author: ![TomSSL](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tomssl/32/253946_2.png) [@TomSSL](https://meta.discourse.org/u/TomSSL)
#### Post date: [2022年三月23日 03:51 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/4 "2022-03-23T03:51:33Z")

</div>

问题是 Discourse encrypt。您可以通过将其放在 yml 文件的最后，并选择在它首次损坏之前的提交（签名验证前几天被破坏了）来修复它，如下所示：

```plaintext
  - git clone https://github.com/discourse/docker-manager.git
  ... 然后是您的其他插件 ...
  - git clone https://github.com/discourse/discourse-encrypt.git
  - cd discourse-encrypt && git checkout 12639de

```

如您所见，我将 Discourse encrypt 插件放在最后，以防 `cd` 和 `git checkout` 命令会影响后续命令（我认为它们不会）。

是的，这是最后一个绝对可以正常工作的版本的提交哈希。

我的网站现在又正常工作了。Discourse Encrypt 再次显示绿色的勾号。

---

<div class="post-metadata">

### Author: ![Mycobee](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mycobee/32/211533_2.png) [@Mycobee](https://meta.discourse.org/u/Mycobee)
#### Post date: [2022年三月23日 04:07 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/5 "2022-03-23T04:07:30Z")

</div>

@TomSSL 感谢您对这个问题的详细分析。

@sam 我明天会提交全栈工程师职位的申请。我想，既然我在追赶那些有问题的插件，不如加入团队，直接处理插件问题 🙂

我本来想直接给你发私信，但这个实例不允许。

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2022年三月23日 07:30 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/6 "2022-03-23T07:30:23Z")

</div>

> [@Mycobee](#):
>
> 我本想私信你，但这个实例不允许。

请看 [Current Openings | Discourse - Civilized Discussion](https://www.discourse.org/jobs) 🙂

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2022年三月23日 10:31 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/7 "2022-03-23T10:31:04Z")

</div>

> [@TomSSL](#):
>
> ```plaintext
> - cd discourse-encrypt && git checkout 12639de
> 
> ```

请不要长时间保留此配置——您的实例将无法接收 Encrypt 插件的未来更新。这很可能会在未来导致问题。

我们已注意到签名验证问题， ~~并正在修复中~~ 并且[已推送修复程序](https://github.com/discourse/discourse-encrypt/commit/9d4e3a7fd95d89e225327bf32117b003d9482a69)。

但是，这个 `Ember.Test` 错误是出乎意料的。@Mycobee 您能确认您正在运行哪个版本的 Discourse 吗？您是如何运行更新的？是通过 `/admin/upgrade` UI 吗？

---

<div class="post-metadata">

### Author: ![TomSSL](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tomssl/32/253946_2.png) [@TomSSL](https://meta.discourse.org/u/TomSSL)
#### Post date: [2022年三月23日 10:39 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/8 "2022-03-23T10:39:52Z")

</div>

> [@david](#):
>
> 请不要长时间保留此配置 - 您的实例将不会收到 Encrypt 插件的未来更新。这很可能会导致将来出现问题。

是的，这至关重要，我忘了提（当时我写这个的时候已经是凌晨 4 点了，我刚把事情弄好，想进来看看是否有人遇到同样的问题）。_这只是一个临时的修复方法，用来让事情重新运行起来。_ 谢谢提醒 @david。

> [@david](#):
>
> 我们已注意到签名验证问题， ~~并正在修复~~ 并且[已推送修复程序](https://github.com/discourse/discourse-encrypt/commit/9d4e3a7fd95d89e225327bf32117b003d9482a69)。

我在今天凌晨 00:00 UTC（十个半小时前）更新所有内容时，这个修复程序对我不起作用。我当时只更新了我的实例，因为我看到签名验证已经修复了。然后我不得不进行上述的临时修复。我的常规更新有没有可能因为某种原因没有获取到最新的代码？

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2022年三月23日 10:43 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/9 "2022-03-23T10:43:08Z")

</div>

[quote=“TomSSL, post:8, topic:221704”]  
我今天早上 00:00 UTC 更新了所有内容，但这个修复对我不起作用  
[/quote]你仍然看到签名验证 ❌ 问题？还是遇到了 `Ember.Test` 问题？

另外，我刚和团队确认过，我们似乎已经找到了 `Ember.Test` 问题的原因，并且很快就会有修复。一旦可用，我们会在此处更新。

---

<div class="post-metadata">

### Author: ![TomSSL](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tomssl/32/253946_2.png) [@TomSSL](https://meta.discourse.org/u/TomSSL)
#### Post date: [2022年三月23日 10:51 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/12 "2022-03-23T10:51:32Z")

</div>

我遇到了一个空白首页的问题，不得不禁用_所有_插件（在安全模式下）才能让网站加载。我通常在周一的UTC时间9:00左右进行每周更新，这次是额外的更新来修复签名验证问题。不过……当然，也一并处理了很多其他更改。在此期间，版本也已更新到 `2.9.0beta3`。

正如你可能已经看到（但也许有些人还没看到），[这是 Discourse Encrypt 的 diff](https://github.com/discourse/discourse-encrypt/compare/12639de5e709099802eb0abec068d5d48640ba9c...eb1bb2fed5c3f72418d93f14d33ba01bad340f95)，对比了我现在运行的版本和截至此消息的最新版本。

另外，实际上花了将近凌晨4点才修复好。在凌晨2点前不久一切都还好，但我之后不得不告诉人们发生了什么（我们的大多数用户在美国）。

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2022年三月23日 13:50 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/13 "2022-03-23T13:50:41Z")

</div>

此问题应通过 Discourse core 中的此提交得到修复：

> <https://github.com/discourse/discourse/commit/7fcf4dcd4bf7281c1f373c09ac93c384f58e0e62>
>
> This matches the behavior of legacy discourse-loader and the regular Ember resol…ver.

因此，一旦您将 Discourse 更新到最新版本，就可以安全地将 discourse-encrypt 更新到最新版本。

---

<div class="post-metadata">

### Author: ![AquaL1te](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aqual1te/32/201966_2.png) [@AquaL1te](https://meta.discourse.org/u/AquaL1te)
#### Post date: [2022年三月23日 14:40 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/14 "2022-03-23T14:40:54Z")

</div>

这确实奏效了，升级现在没有问题了。

---

<div class="post-metadata">

### Author: ![Mycobee](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mycobee/32/211533_2.png) [@Mycobee](https://meta.discourse.org/u/Mycobee)
#### Post date: [2022年三月23日 15:15 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/17 "2022-03-23T15:15:17Z")

</div>

> [@david](#):
>
> 然而，这个 `Ember.Test` 错误是出乎意料的。@Mycobee 你能确认你运行的是哪个版本的 Discourse 吗？你是如何进行更新的？通过 `/admin/upgrade` UI？

@david 我升级到了 2.9.0.beta3，这导致了问题。

关于升级过程，我通常通过 `/admin/upgrade` UI 进行。这次情况不同。

我只通过升级 UI 升级了 docker-manager。之后，我不得不处理其他事情，几个小时后才访问 `/admin/upgrade` 路径来完成升级过程。

我看到一个文本页面，告诉我需要去主机，切换到 `/var/discourse` 目录，`git pull` 并使用 `./launcher` 重建应用程序……所以我照做了，然后混乱就开始了。

虽然压力很大，但我在这个论坛上发现有关未捕获的 TypeError 与插件有关的信息，所以我从 `app.yml` 插件中删除了所有非必需的插件，并重建了容器。这时，ember 应用又开始工作了。

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2022年三月26日 08:00 UTC](https://meta.discourse.org/t/frontend-on-prod-site-down-ember-test-error/221704/21 "2022-03-26T08:00:35Z")

</div>

此主题已在 2 天后自动关闭。不再允许回复。
