Ошибка: Что-то пошло не так — «Ошибка при обработке маршрута: discovery.categories»

У одного администратора возникла странная ошибка после обновления Discourse. Ошибка возникает, когда пользователь нажимает кнопку «Назад» или логотип сайта. Похоже, это запускает JavaScript для перехода в корень/на главную страницу сайта, но вместо этого возникают следующие ошибки:

Визуально ошибка выглядит так:

В консоли JS:
console

Также я обнаружил, что это происходит при любых кликах по навигационной панели, например, при попытке перейти в /admin.

Есть ли какие-то идеи, как углубиться в расследование? Ошибок в production.log или где-либо ещё не видно, так что это действительно поставило в тупик, поскольку проблема, похоже, связана с JavaScript.

Вы пробовали Как использовать безопасный режим Discourse

Спасибо за предложение. Странно, но ошибка всё ещё сохранялась, даже при включении всех трёх опций в безопасном режиме:

До сих пор упираюсь в тупики при дальнейшей отладке. Я склонен подозревать, что «Безопасный режим» не полностью отключает JavaScript из-за этого… Есть ли ещё какой-то шаг, который мог бы полностью исключить JavaScript из функционала для тестирования?

Доступен ли ваш сайт для публичного доступа? Если да, не могли бы вы поделиться ссылкой? (Если вы предпочитаете не публиковать её открыто, можно отправить в личные сообщения).

Спасибо за ссылку, @mreach. Со своей стороны я не вижу никаких очевидных проблем.

Вы упомянули, что это затрагивает только одного пользователя на сайте. Знаете ли вы, ограничена ли проблема одним браузером/устройством? Или это происходит с этим пользователем даже при входе в систему с другого устройства?

Если дело только в одном браузере/устройстве, это может указывать на то, что расширение браузера (например, блокировщик рекламы) мешает работе кода Discourse.

Если проблема проявляется во всех браузерах, это сложнее. Установлены ли на вашем форуме сторонние плагины? Также было бы интересно узнать, какую «домашнюю страницу по умолчанию» настроил пользователь (это можно найти в его настройках «интерфейса» Discourse).

Спасибо — да, у меня были в основном те же мысли. Я попросил их отключить все расширения и очистить все данные браузера. Только что ещё один пользователь сообщил о той же проблеме… И оба они используют Chrome. Я попросил их попробовать Firefox и Brave, и каждый из них сказал, что там всё работает, но ничто из того, что они пробовали, не помогает снова заставить Chrome работать «правильно». Я ещё раз спросил их о результатах в режиме инкогнито, и оба сообщили, что в инкогнито всё работает. И всё это произошло после последнего обновления Discourse, так что, похоже, что-то не очищается в JavaScript каким-то образом… Что я действительно не понимаю, как это возможно.

Я спросил их, что они настроили в качестве домашней страницы… Сообщу вам. Это очень хорошая идея, которая мне раньше не приходила в голову…

Хорошо, интересно, но не окончательно:

У пользователя, у которого возникла проблема, в качестве домашней страницы установлена «Категории»:
image

Если изменить её на другую, например «Последние», то домашняя страница загружается при клике на логотип сайта и использовании стрелки «Назад» в браузере. Однако, если вернуть обратно «Категории» вместо «Последних», проблема/ошибка возвращается. :weary_face:

Также этот пользователь является администратором. При клике на иконку «гамбургер» в правом верхнем углу и выборе «Администрирование» у него появляется та же ошибка, о которой сообщалось выше — даже если домашняя страница изменена на «Последние» вместо «Категорий».

Конечно, это новая информация, но с моей точки зрения она не совсем помогает. Хм.

Есть ли возможность получить более подробную информацию об этих ошибках? Они должны быть раскрываемыми и, надеюсь, содержать немного больше деталей о каждой ошибке.

Мне выдали следующий вывод консоли: https://pastebin.com/LuDHesyQ

Ещё раз спасибо за предложения на данный момент — есть ли у вас какие-либо замечания по этому поводу, @david?

Боюсь, что нет — эти логи довольно общие и, похоже, мало что говорят о реальной причине.

Самый интересный лог находится в верхней части скриншота, который вы поделили выше, и он также является последней записью в pastebin:

domainname.com/:1 Uncaught (in promise) {readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}

Будет полезно узнать, что находится внутри .... Если вы нажмёте на маленький треугольник слева от лога, он должен развернуться и показать дополнительную информацию. Копия/вставка или скриншот этого могут помочь.

Отдельно: видите ли вы какие-либо ошибки на стороне сервера (в /logs)? И используете ли вы последнюю версию Discourse?

Да, используется последняя версия. Я проверил логи во время ошибки и не увидел ничего ни в продакшене, ни в других местах…

Хм, они выполнили копирование объекта на этой строке и получили следующее:

{
    "readyState": 4,
    "responseText": "<!doctype html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"refresh\" content=\"30\">\n        <title>domainname.com Maintenance</title>\n        <style>\n	    html {\n	        background: #3d4147;\n	    }\n            .center {\n                display: flex;\n                justify-content: center;\n            }\n            .container {\n                background: #717984;\n                max-width: 500px;\n                padding: 5px 50px 30px 50px;\n                margin-top: 20px;\n            }\n            .title {\n                padding-top: 20px;\n            }\n            h1, p {\n                font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n            }\n            @keyframes spin {\n                from { transform: rotate(0deg); }\n                to { transform: rotate(360deg); }\n            }\n            .spinner {\n                animation: spin 10s infinite linear;\n                height: 75px;\n                width: 75px;\n                border: 7px solid #555555;\n                border-right-color: transparent;\n                border-radius: 50%;\n                margin-top: 20px;\n            }\n        </style>\n    </head>\n    <body>\n                <div class=\"center\">\n                    <img src=\"/err/site.png\" alt=\"site logo image\" width=\"512\" height=\"171\">\n                </div>\n        <div class=\"center\">\n            <div class=\"container\">\n		<center>\n                  <h1 class=\"title\" >We're temporarily under maintenance&hellip;</h1>\n		</center>\n\n                <div class=\"center\">\n                    <img src=\"/err/error.png\" alt=\"maintenance image\" width=\"150\" height=\"152\">\n                </div>\n\t	<center>\n                  <p>domainname.com is currently undergoing maintenance. We're either upgrading the site or performing scheduled maintenance. </p>\n		  <p>For your convenience, we've set this page to AUTOMATICALLY refresh for you when the system's available again!</p>\n                  <p>Thanks so much for your patience.</p>\n		</center>\n		\n                <div class=\"center\">\n                    <div class=\"spinner\"></div>\n                </div>\n            </div>\n        </div>\n    </body>\n</html>\n",
    "status": 200,
    "statusText": "parsererror"
}

И скриншот этого из консоли:

@david, ты это имел в виду? Надеюсь, мы получили правильные результаты.

Вы запускаете Discourse за прокси? Я почти уверен, что это сообщение о техническом обслуживании исходит не от самого Discourse :thinking:

Это страница ошибки, которая отображается, когда сайт находится на техническом обслуживании (например, во время обновления или обновления Docker)…

Полагаю, в момент возникновения ошибки ваш сайт не находился на плановом техническом обслуживании? В таком случае проблема, скорее всего, кроется в реализации или конфигурации прокси. Чтобы исключить этот вариант, сможете ли вы открыть доступ к Discourse напрямую на портах 80/443? (согласно нашим стандартным инструкциям по установке)

Конечно, возможно, что ошибка в самом Discourse приводит к тому, что прокси отображает это сообщение. Однако диагностировать это сложно, не зная, что именно возвращал Discourse. Возможно, ваш прокси ведёт логи ответов от upstream-сервера Discourse?