Модальное окно выбора аватара вылетает с ошибкой "t.split is not a function" (avatar-selector.gjs)

Краткое описание:
Открытие модального окна выбора аватара (для смены аватара профиля) вызывает ошибку JavaScript, и всплывающее окно работает некорректно.

Версия Discourse: v2026.7.0-latest (коммит 59588b5d2a)
Версия Ember: v6.10.1

Шаги для воспроизведения:

  1. Перейдите в профиль пользователя.
  2. Нажмите на опцию смены аватара.
  3. Открывается модальное окно выбора аватара (запускается через поток подтверждения «решено», согласно трассировке стека).
  4. Ошибка немедленно появляется в консоли браузера, и модальное окно работает некорректно.

Ожидаемое поведение:
Модальное окно выбора аватара должно открываться нормально и позволять пользователю выбрать или загрузить аватар.

Фактическое поведение:
В консоли возникает ошибка: TypeError: t.split is not a function внутри геттера selectableAvatars в файле avatar-selector.gjs.

Выполненные действия по устранению неполадок:

  • Протестировано в безопасном режиме с отключенными всеми темами и плагинами; ошибка сохраняется, поэтому она, по-видимому, не вызвана темой или плагином.

Браузер / ОС:
[Brave / Windows 11]

Журнал консоли / трассировка стека:

?safe_mode=no_themes,no_plugins:346  GET https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496 net::ERR_BLOCKED_BY_CLIENT
app.js:365 ℹ️ Discourse v2026.7.0-latest — https://github.com/discourse/discourse/commits/59588b5d2a — Ember v6.10.1
avatar-selector.gjs:47 Uncaught (in promise) TypeError: t.split is not a function
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 лайка

Можете ли вы воспроизвести эту проблему здесь на meta?

Сообщение об ошибке выше происходит с вашего экземпляра, и вы используете Cloudflare? Эта часть сообщения указывает на это.

1 лайк

Привет,

Спасибо за ответ и за то, что указали на это.

В ответ на ваш вопрос: нет, я не могу воспроизвести это на meta.discourse.org, проблема возникает только на моём собственном форуме.

Что касается Cloudflare: да, мой форум находится за Cloudflare, но эта конкретная строка в консоли (beacon.min.js / ERR_BLOCKED_BY_CLIENT) не связана с самой ошибкой. Она вызвана тем, что Brave Shields блокирует аналитический скрипт Cloudflare. Я полностью отключил Brave Shields, и эта строка исчезла, но ошибка в выборе аватара (TypeError: t.split is not a function) по-прежнему возникает точно так же.

Для контекста: я использую Cloudflare для своего форума уже почти 3 года, и смена аватара профиля всегда работала нормально до сих пор. Поэтому это похоже на регрессию, а не на давнюю проблему, связанную с Cloudflare.

Поскольку это не воспроизводится на meta, возможно, проблема специфична для моей конфигурации. Готов проверить любые настройки или логи, которые помогут сузить круг поиска. Дайте знать, что стоит проверить (например, значение настройки сайта «selectable avatars» или что-либо, связанное с плагином Solved, который, как я заметил, фигурирует в стеке вызовов как триггер для этого модального окна).

Спасибо, что разобрались в этом.

2 лайка

да, ты прав, скорее всего это не Cloudflare.

Я протестировал это на отдельном экземпляре, где включил только выбираемые аватары. Мне пришлось загрузить два аватара (требование настройки сайта), а затем включить эту функцию.

Можешь изменить эти две настройки и посмотреть, изменится ли что-то с твоей стороны?

2 лайка

Привет,

Спасибо, что разобрались в этом. Вы были правы.

Я загрузил два аватара в настройку «выбираемые аватары», как вы и советовали, и ошибка исчезла. Теперь окно выбора аватара открывается и работает корректно.

Похоже, что корень проблемы в следующем: когда включена настройка «выбираемые аватары», но загружено меньше требуемого количества аватаров (или список пуст), модальное окно падает, вместо того чтобы обработать ошибку корректно. В моём случае настройка была включена, но аватары не были загружены, что вызвало ошибку t.split is not a function.

Я всё ещё считаю, что это стоит исправить на уровне ядра. Даже если настройка настроена неправильно, модальное окно не должно выбрасывать необработанную ошибку TypeError и полностью ломать выбор аватара. В идеале оно должно либо:

  • возвращаться к обычному выбору аватара (пропуская функцию «выбираемые аватары»), если список пуст или некорректен, либо
  • показывать понятное сообщение об ошибке валидации, вместо тихого сбоя JavaScript

Ещё раз спасибо за помощь в выявлении этой проблемы!

2 лайка

Да, это справедливо. Хотите отправить исправление? Если вы с этим знакомы, я с радостью приму ваш Pull Request по этому вопросу.

1 лайк

Я занимаюсь разработкой программного обеспечения, но у меня не так много опыта в подобных вещах. Поэтому я немного колеблюсь, предлагая исправление самостоятельно, чтобы не ошибиться. Если кто-нибудь из основной команды захочет взять это в свои руки, было бы здорово. Но я могу создать issue на GitHub, если хотите.

3 лайка

Без проблем, это должно помочь: DEV: Fix JS error in modal when selected avatars is misconfigured - Pull Request #41663 - discourse/discourse - GitHub

1 лайк