오류: 문제가 발생했습니다 - "경로 처리 중 오류: discovery.categories"

관리자 사용자 한 명이 Discourse 업데이트 후 이상한 오류를 겪고 있습니다. 이 오류는 사용자가 뒤로 가기 버튼이나 사이트 로고를 클릭할 때 발생합니다. 사이트의 루트/홈으로 이동하도록 JavaScript가 트리거되는 것처럼 보이지만, 대신 다음과 같은 오류가 발생합니다:

시각적으로 오류는 다음과 같이 표시됩니다:

JS 콘솔에서는:
console

또한 /admin으로 이동하려는 시도 등 모든 네비게이션 바 클릭에서도 이 문제가 발생한다는 것을 발견했습니다.

이 문제를 더 깊이 추적하는 데 도움이 될 만한 생각이 있으신가요? production.log나 다른 곳에서 오류를 발견하지 못해, JavaScript와 관련된 것으로 보이지만 아직 원인을 찾지 못해 고개를 갸웃거리고 있습니다.

Discourse 안전 모드 사용 방법을 시도해 보셨나요?

제안해 주셔서 감사합니다. 이상하게도 안전 모드에서 3가지 옵션을 모두 활성화했음에도 여전히 오류가 발생했습니다:

아직까지 추가 디버깅 과정에서 막혀 있는 상태입니다. 이로 인해 "안전 모드"가 JavaScript를 완전히 비활성화하지 못하고 있는 것 같습니다. 테스트를 위해 JavaScript 기능을 더 철저히 제거할 수 있는 다른 단계가 있을까요?

사이트가 공개적으로 접근 가능한가요? 그렇다면 링크를 공유해 주실 수 있을까요? (공개적으로 게시하기 꺼리시면 개인 메시지로 보내주셔도 됩니다)

링크를 공유해 주셔서 감사합니다 @mreach. 여기서는 눈에 띄는 문제를 찾지 못하겠습니다.

사이트에서 이 문제가 한 명의 사용자에게만 발생한다고 언급하셨는데요. 특정 브라우저/기기에서만 발생하는 문제인지 아시나요? 아니면 다른 기기로 로그인해도 같은 문제가 발생하는 건가요?

특정 브라우저/기기에서만 발생하는 경우라면, 브라우저 플러그인(예: 광고 차단기)이 Discourse의 코드에 간섭을 일으키고 있을 수 있습니다.

모든 브라우저에서 문제가 발생한다면 해결이 좀 더 복잡합니다. 포럼에 서드파티 플러그인이 설치되어 있나요? 해당 사용자가 Discourse의 ‘인터페이스’ 설정에서 '기본 홈 페이지’를 어떻게 설정해 두었는지도 알아볼 가치가 있습니다.

감사합니다. 네, 저도 대부분 같은 생각을 하고 있었습니다. 모든 확장 기능을 비활성화하고 브라우저 데이터를 모두 삭제하도록 지시했습니다. 그런데 또 다른 사용자가 동일한 문제를 보고했습니다… 그리고 두 사람 모두 Chrome을 사용 중입니다. Firefox와 Brave를 시도해 보라고 했더니, 두 사람 모두 해당 브라우저에서는 정상적으로 작동한다고 했지만, Chrome의 경우 어떤 조치를 취해도 다시 “정상적으로” 작동하지 않는다고 합니다. 다시 시크릿 모드에서의 결과를 물어보았는데, 두 사람 모두 시크릿 모드에서는 정상적으로 작동한다고 보고했습니다. 다시 한번 말씀드리지만, 이 모든 것은 마지막 Discourse 업데이트 이후에 일어난 일입니다. 따라서 JS에서 무언가가 제대로 정리되지 않는 것 같습니다… 어떻게 그런 일이 될 수 있는지 정말로 이해가 되지 않습니다.

두 사람에게 홈페이지로 무엇을 설정해 두었는지 물어보았습니다. 결과를 알려드리겠습니다. 정말 좋은 아이디어인데, 제 머리에는 떠오르지 않았던 것 같습니다…

음, 흥미롭긴 하지만 결정적인 단서가 되지는 않네요:

문제를 겪고 있는 사용자는 홈 화면을 "Categories"로 설정해 두었습니다:
image

이를 “Latest” 등으로 변경하면, 사이트 로고를 클릭하거나 브라우저의 “뒤로” 화살표를 사용하여 홈 페이지를 정상적으로 불러올 수 있습니다. 하지만 다시 "Categories"로 변경하면 aforementioned 문제/에러가 재발합니다. :weary_face:

또한 이 사용자는 관리자이기도 하며, 오른쪽 위 햄버거 아이콘을 클릭한 뒤 "Admin"을 선택하면 위에서 보고된 것과 동일한 에러가 발생합니다. 홈 화면이 "Categories"가 아닌 "Latest"로 설정된 상태에서도 마찬가지입니다.

물론 새로운 정보이지만, 제 입장에서 보면 도움이 되는 내용은 아닙니다. 음.

이 오류들에 대해 좀 더 자세한 정보를 얻을 수 있을까요? 모두 확장 가능하며, 오류에 대해 좀 더 자세한 내용이 포함되었으면 합니다.

다음과 같은 콘솔 출력을 받았습니다: 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\t    html {\n\t        background: #3d4147;\n\t    }\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\t\t<center>\n                  <h1 class=\"title\" >We're temporarily under maintenance&hellip;</h1>\n\t\t</center>\n\n                <div class=\"center\">\n                    <img src=\"/err/error.png\" alt=\"maintenance image\" width=\"150\" height=\"152\">\n                </div>\n\n\t\t<center>\n                  <p>domainname.com is currently undergoing maintenance. We're either upgrading the site or performing scheduled maintenance. </p>\n\t\t  <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\t\t</center>\n\t\t\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:

사이트가 유지보수(업그레이드나 도커 업데이트 등) 중에 렌더링되는 오류 페이지 구현입니다…

오류가 발생한 시점에 해당 사이트가 의도적인 유지보수를 진행 중이 아니었나요? 그렇다면 해당 프록시 구현/설정에서 문제가 있는 것으로 보입니다. 이를 배제하기 위해, 표준 설치 지침에 따라 Discourse를 포트 80/443에 직접 노출할 수 있나요?

물론, Discourse의 오류로 인해 프록시가 이 메시지를 표시하는 경우도 가능합니다. 하지만 Discourse가 반환한 내용을 알지 못하면 이를 진단하기 어렵습니다. 프록시가 업스트림 Discourse의 응답에 대한 로그를 기록하고 있을까요?