Ошибка на странице приглашений: "Cannot read properties of undefined (reading 'slice')"

В последней стабильной версии при нажатии кнопки «Создать ссылку для приглашения» на странице /u/user_name/invited/pending возникает ошибка JavaScript.

В консоли отображается:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘slice’)
at h.shortKey (chunk.f105ceace2ad381ddb2f.d41d8cd9.js:241:61588)

Если объект приглашения отображается до того, как поле invite_key будет заполнено данными с сервера, то invite_key оказывается неопределённым (undefined), и приложение падает при попытке вызвать .slice() для пустого значения.

В файле invite.js функция shortKey пытается сократить ключ приглашения:

shortKey(key) {
  return key.slice(0, 4) + "…";
}

Мне не удалось воспроизвести эту ошибку на meta, возможно, я сталкиваюсь с ней из-за меньшей скорости моего сервера или сети. Однако проверка наличия ключа перед использованием, похоже, решает проблему:

return key ? key.slice(0, 4) + "…" : "";

Для простого исправления лучше написать здесь или открыть PR?

Ключ приглашения не может быть null:

А здесь происходит итерация по model.invites:

Я посмотрел код и не уверен, откуда может появиться частично заполненный объект, даже когда я добавил задержку 400 мс в сети здесь — воспроизвести не удалось.

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

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

Добавление задержки в before_create должно это выявить.

Я обновил код до:

{{else}}
  {{icon "link"}}
+ {{#if invite.invite_key}}
    {{i18n
      "user.invited.invited_via_link"
      key=invite.shortKey
      count=invite.redemption_count
      max=invite.max_redemptions_allowed
    }}
+ {{else}}
+   <em>Генерация ссылки...</em>
+ {{/if}}
{{/if}}

Думаю, это будет приемлемо в виде PR, при условии, что он локализован.

Все еще немного запутался, где мы заполняем Invite частично заполненным объектом, но это лучше, чем сбой, и кажется мне правильным.

Интересно, исправлено ли это в latest. Если да, то нам нужно лишь найти коммит, который исправил проблему, и перенести его в стабильную версию.

Приглашение добавляется в список сразу после вызова save(), но до того, как invite_key будет заполнен данными с сервера. Оно всё ещё присутствует в latest, поэтому я открыл PR #35679

1 лайк