버그 설명
사용자가 커스텀 메시지가 필요한 플래그 유형(예: notify_moderators, notify_user, 또는 "메시지 필수"가 활성화된 관리자 생성 커스텀 플래그)을 선택하고 메시지를 입력한 후 제출하면 브라우저에서 처리되지 않는 TypeError가 발생하며 플래그가 제출되지 않습니다.
재현 단계
- 임의의 토픽 게시글을 방문합니다.
- 플래그 모달을 열기 위해 플래그 버튼을 클릭합니다.
- 메시지가 필요한 플래그 유형을 선택합니다(예: “기타” /
notify_moderators, 또는 "메시지 필수"가 활성화된 관리자 → 플래그에서 생성된 모든 커스텀 플래그). - 텍스트 영역에 메시지를 입력합니다(최소 길이를 통과할 만큼 충분히 길게).
- 제출 버튼을 클릭합니다.
기대되는 동작
플래그가 성공적으로 제출됩니다.
실제 동작
플래그 모달은 닫히지만 플래그는 제출되지 않습니다. 브라우저 콘솔에는 다음과 같은 내용이 표시됩니다:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'act')
at n.create (flag.js:24:8)
at S.createFlag (flag.gjs:205:32)
at S.takeAction (flag.gjs:196:12)
at m.perform (reviewable-bundled-action.gjs:47:17)
at ej._boundaryActionHandler (select-kit.js:685:34)
...
근본 원인 분석
크래시는 Flag#create(flag.js:24)에서 발생합니다:
create(flagModal, opts) {
const postAction = this.postActionFor(flagModal); // undefined 반환
// ...
postAction.act(...) // ← TypeError: Cannot read properties of undefined
}
PostFlag의 postActionFor는 actions_summary 내에서 숫자 id로 선택된 플래그를 조회합니다:
// post-flag.js
postActionFor(flagModal) {
return flagModal.args.model.flagModel.actions_summary.find(
(item) => item.id === flagModal.selected.id
);
}
백엔드 PostSerializer는 can_act, count, 또는 acted 중 적어도 하나가 참일 때만 actions_summary에 플래그 항목을 포함합니다:
result << summary if summary[:can_act] || summary[:count] || summary[:acted]
require_message: true 플래그(모두 notify_type: true인 경우)의 경우, post_can_act?는 already_did_flagging이 참일 때 can_act: false로 설정합니다. 즉, 사용자가 해당 게시글에 이전에 notify 유형 플래그를 제출한 경우입니다. 이 경우 항목은 actions_summary에 존재하지 않으며, postActionFor는 undefined를 반환하고 크래시가 발생합니다.
한편, UI에서 사용자가 선택할 수 있는 것을 제어하는 Post#flagsAvailable은 페이지 로드 시점에 구축된 actionByName 맵을 사용하므로, actions_summary에 더 이상 포함되지 않더라도 플래그가 여전히 선택 가능하게 나타날 수 있습니다.
부차적 버그
flag.gjs에도 깨진 비교가 있습니다:
const NOTIFY_MODERATORS_KEY = "notify_moderators"; // 문자열
get notifyModeratorsFlag() {
return this.flagsAvailable.find((f) => f.id === NOTIFY_MODERATORS_KEY);
// ^ 숫자 ^ 문자열 — 항상 false
}
f.id는 숫자이지만 NOTIFY_MODERATORS_KEY는 문자열이므로 ===는 항상 false를 반환하고 notifyModeratorsFlag는 항상 undefined가 됩니다. 이로 인해 flagForReview()의 “리뷰용 플래그” 버튼 로직이 깨집니다.
제안된 수정안
PostFlag#postActionFor는 id로 actions_summary를 검색하는 대신 name_key를 키로 사용하는 actionByName 맵을 사용해야 합니다. 이는 TopicFlag#postActionFor가 이미 작동하는 방식과 일치합니다:
// post-flag.js
postActionFor(flagModal) {
return flagModal.args.model.flagModel.actionByName[
flagModal.selected.name_key
];
}
그리고 notifyModeratorsFlag는 id가 아닌 name_key로 비교해야 합니다:
get notifyModeratorsFlag() {
return this.flagsAvailable.find((f) => f.name_key === NOTIFY_MODERATORS_KEY);
}
Discourse 버전
2026.5.0-latest
재현 가능 환경
- 최신
main브랜치



