Avatar-Auswahl-Modal stürzt mit „t.split ist keine Funktion“ ab (avatar-selector.gjs)

Zusammenfassung:
Das Öffnen des Avatar-Auswahl-Modals (zum Ändern des Profil-Avatars) löst einen JavaScript-Fehler aus und das Popup funktioniert nicht korrekt.

Discourse-Version: v2026.7.0-latest (Commit 59588b5d2a)
Ember-Version: v6.10.1

Schritte zur Reproduktion:

  1. Gehe zum Benutzerprofil
  2. Klicke auf die Option, den Avatar zu ändern
  3. Das Avatar-Auswahl-Modal wird geöffnet (ausgelöst durch einen Bestätigungsmodal-Flow für einen „gelöst“-Move, basierend auf dem Stack Trace)
  4. Ein Fehler erscheint sofort in der Browser-Konsole und das Modal verhält sich nicht korrekt

Erwartetes Verhalten:
Das Avatar-Auswahl-Modal sollte sich normal öffnen und dem Nutzer ermöglichen, einen Avatar auszuwählen/hochzuladen.

Tatsächliches Verhalten:
Die Konsole gibt aus: TypeError: t.split is keine Funktion innerhalb des selectableAvatars-Getters in avatar-selector.gjs.

Bereits durchgeführte Fehlerbehebung:

  • Im Safe-Modus getestet, mit allen Themes und Plugins deaktiviert. Der Fehler tritt weiterhin auf, daher scheint er nicht durch ein Theme oder Plugin verursacht zu sein.

Browser / Betriebssystem:

Brave / Windows 11

Konsolenprotokoll / Stack Trace:
```
?safe_mode=no_themes,no_plugins:346 GET https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496 net::ERR_BLOCKED_BY_CLIENT
app.js:365 :information_source: Discourse v2026.7.0-latest — Commits · discourse/discourse · GitHub — Ember v6.10.1
avatar-selector.gjs:47 Uncaught (in promise) TypeError: t.split is keine Funktion
at get selectableAvatars (avatar-selector.gjs:47:47)
at R (cache-DtDz7X5V.js:1647:15)
at index.js:87:32
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index-DaCZcoCY.js:4335:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index-DaCZcoCY.js:4335:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index.js:158:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at Object.evaluate (index.js:1970:16)
at Object.evaluate (index.js:103:106)
at zb.evaluateSyscall (index.js:2873:20)
at zb.evaluateInner (index.js:2852:64)
at zb.evaluateOuter (index.js:2849:10)
at e.next (index.js:4167:45)
at e._execute (index.js:4157:21)
at e.execute (index.js:4133:41)
at _x.handleException (index.js:3450:19)
at bx.handleException (index.js:3592:52)
at hx.throw (index.js:3414:16)
at iy.evaluate (index.js:565:37)
at hx._execute (index.js:3401:34)
at hx.execute (index.js:3393:17)
at xx.rerender (index.js:3610:8)
at ww.render (index-DaCZcoCY.js:5211:23)
at index-DaCZcoCY.js:5409:16
at xb (index.js:2414:7)
at e.renderRoots (index-DaCZcoCY.js:5389:7)
at #o (index-DaCZcoCY.js:5374:12)
at e.revalidate (index-DaCZcoCY.js:5435:10)
at invoke (index.js:264:14)
at Rc.flush (index.js:180:11)
at zc.flush (index.js:334:19)
at pl._end (index.js:762:32)
at _boundAutorunEnd (index.js:499:12)
selectableAvatars @ avatar-selector.gjs:47
_getProp @ cache-DtDz7X5V.js:1647
(anonymous) @ index.js:87
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index-DaCZcoCY.js:4335
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index-DaCZcoCY.js:4335
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index.js:158
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index.js:1970
evaluate @ index.js:103
evaluateSyscall @ index.js:2873
evaluateInner @ index.js:2852
evaluateOuter @ index.js:2849
next @ index.js:4167
_execute @ index.js:4157
execute @ index.js:4133
handleException @ index.js:3450
handleException @ index.js:3592
throw @ index.js:3414
evaluate @ index.js:565
_execute @ index.js:3401
execute @ index.js:3393
rerender @ index.js:3610
(anonymous) @ index-DaCZcoCY.js:5211
(anonymous) @ index-DaCZcoCY.js:5409
inTransaction @ index.js:2414
renderRoots @ index-DaCZcoCY.js:5389
#o @ index-DaCZcoCY.js:5374
revalidate @ index-DaCZcoCY.js:5435
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-DaCZcoCY.js:4146
dirtyTag @ index.js:229
dirtyTagFor @ index.js:848
setter @ index.js:871
set @ cache-DtDz7X5V.js:1886
show @ modal.js:57
await in show
showAvatarSelector @ account.js:43
_join @ index.js:788
join @ index.js:605
join @ index.js:152
(anonymous) @ route-action.js:48
(anonymous) @ index.js:2534
(anonymous) @ d-button.gts:216
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gts:213
click @ d-button.gts:167
```

2 „Gefällt mir“

Können Sie dieses Problem hier auf Meta reproduzieren?

Stammt die obige Fehlermeldung von Ihrer Instanz, und sind Sie hinter Cloudflare? Dieser Teil würde darauf hindeuten.

1 „Gefällt mir“

Hi,

Danke für die Antwort und den Hinweis.

Um deine Frage zu beantworten: Nein, ich kann das auf meta.discourse.org selbst nicht reproduzieren, nur auf meinem eigenen Forum.

Bezüglich Cloudflare: Ja, mein Forum liegt hinter Cloudflare, aber diese spezifische Konsolenzeile (die beacon.min.js / ERR_BLOCKED_BY_CLIENT) hat nichts mit dem eigentlichen Fehler zu tun. Sie wird dadurch verursacht, dass Brave Shields das Analytics-Skript von Cloudflare blockiert. Ich habe Brave Shields komplett deaktiviert, und diese Zeile verschwindet, aber der Fehler beim Avatar-Auswahl-Dialog (TypeError: t.split is not a function) tritt weiterhin genau auf die gleiche Weise auf.

Zum Kontext: Ich betrete mein Forum seit fast drei Jahren hinter Cloudflare, und das Ändern des Profil-Avatars hat bisher immer einwandfrei funktioniert. Es handelt sich hier also wahrscheinlich um eine Regression, nicht um ein langjähriges Cloudflare-bezogenes Problem.

Da es sich auf meta nicht reproduzieren lässt, könnte es spezifisch für etwas in meiner Konfiguration sein. Ich bin gerne bereit, mich in Einstellungen oder Logs einzuarbeiten, um das Problem einzugrenzen. Sag mir bitte, was hilfreich wäre zu prüfen (z. B. der Wert der Site-Einstellung „selectable avatars“ oder etwas im Zusammenhang mit dem Solved-Plugin, das ich im Stacktrace als Auslöser dieses Modals bemerkt habe).

Danke, dass du dich damit beschäftigst.

2 „Gefällt mir“

ja, du hast recht, es ist wahrscheinlich nicht Cloudflare.

Ich habe dies auf einer separaten Instanz getestet, auf der ich nur auswählbare Avatare aktiviert habe. Ich musste zwei Avatare hochladen (Anforderung der Site-Einstellung) und dann aktivieren.

Kannst du diese beiden Einstellungen ändern und sehen, ob sich dadurch etwas auf deiner Seite ändert?

2 „Gefällt mir“

Hi,

Danke, dass du dich da reingearbeitet hast. Du hattest recht.

Ich habe, wie du vorgeschlagen hast, zwei Avatare in die Einstellung „auswählbare Avatare“ hochgeladen, und der Fehler ist weg. Der Avatar-Auswähler öffnet sich nun und funktioniert korrekt.

Anscheinend liegt die Ursache darin, dass das Modal abstürzt, statt den Fehler elegant zu behandeln, wenn „auswählbare Avatare“ aktiviert ist, aber weniger Avatare hochgeladen wurden als erforderlich (oder die Liste leer ist). In meinem Fall war die Einstellung aktiviert, ohne dass Avatare hochgeladen wurden, was den Fehler t.split is not a function auslöste.

Ich bin immer noch der Meinung, dass dies auf Kernebene behoben werden sollte. Selbst wenn die Einstellung falsch konfiguriert ist, sollte das Modal keinen unbehandelten TypeError auswerfen und die Avatar-Auswahl komplett lahmlegen. Idealerweise würde es entweder:

  • auf die normale Avatar-Auswahl zurückgreifen (die Funktion „auswählbare Avatare“ überspringen), wenn die Liste leer oder ungültig ist, oder
  • eine klare Validierungsfehlermeldung anzeigen, statt stillschweigend einen JS-Absturz zu verursachen

Nochmals vielen Dank für die Hilfe bei der Eingrenzung des Problems!

2 „Gefällt mir“

Ja, das ist fair. Möchtest du einen Fix einreichen? Wenn du dich damit auskennst, nehme ich gerne einen Pull Request dazu an.

1 „Gefällt mir“

Ich beschäftige mich mit Softwareentwicklung, habe aber nicht viel Erfahrung mit dieser Art von Dingen. Daher zögere ich etwas, selbst einen Fix einzureichen und das Risiko einzugehen, es falsch zu machen. Wenn jemand aus dem Kernteam das von hier aus übernehmen möchte, wäre das großartig. Aber ich kann auch ein Issue auf GitHub eröffnen, wenn ihr wollt.

3 „Gefällt mir“

Kein Problem, das sollte es tun: DEV: Fix JS error in modal when selected avatars is misconfigured - Pull Request #41663 - discourse/discourse - GitHub

1 „Gefällt mir“