강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

terecal님의 프로필 이미지
terecal

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

리트윗하기

403 에러 발생시에 retweetError 가 null 로 찍혀여

작성

·

270

0

안녕하세요 zerocho 님 

질문이 있습니다.

현재 라우터 로직의 403 에러에 해당할 경우 (본인의 글을 리트윗 하거나 이미 리트윗한 글을 리트윗할때) 아래와 같이 응답을 하는데

        if (!post) {
            return res.status(403).send('존재하지 않는 게시글입니다.');
        }
        if (req.user.id === post.UserId || (post.Retweet && post.Retweet.UserId === req.user.id)) {
            return res.status(403).send('자신의 글은 리트윗할 수 없습니다.');
        }
문제는 프론트에서 에러 메세지를 try catch로 받을수가 없습니다. 즉 아래의 console.log("retweetAPI 호출 after"); 이 실행되지 않습니다.
function retweetAPI(data) {
    console.log("data : ", data);
    return axios.post(`/post/${data}/retweet`);
}
function* retweet(action) {
    console.log("saga 실행 확인");
    try {
        console.log("retweetAPI 호출 before");
        const result = yield call(retweetAPI, action.data);
        console.log("retweetAPI 호출 after");
        console.log("result : ", result);
        yield put({
            type: RETWEET_SUCCESS,
            data: result.data,
        });
    } catch (err) {
        console.error("retweet error from saga : ",  err);
        yield put({
            type: RETWEET_FAILURE,
            error: err,
        });
    }
}
그런데 리듀서의 retweetError 를 다음과 같이 설정하고
            case RETWEET_FAILURE:
                draft.retweetLoading = false;
                draft.retweetError = action.error.message;
                break;
onRetweet을 다음과 같이 설정하면
    const onRetweet = useCallback(() => {
        if (!id) {
            return alert('로그인이 필요합니다.');
        }
        dispatch({
            type: RETWEET_REQUEST,
            data: post.id,
        });
        alert("retweetError : " + retweetError)
        if (retweetError != "") {
            notification.open({
                message: '알림 메세지',
                description:
                    '본인의 글은 리트윗할수 없습니다 : ', retweetError,
                onClick: () => {
                    console.log('Notification Clicked!');
                },
            });
        }
    }, [id]);
에러 메세지가 아래처럼 null로 출력되여
라우터 로직의 에러 메세지를 받아서 alert 이나 notification 으로 출력하려면 어떻게 바꿔야 될까여?
            return res.status(403).send('자신의 글은 리트윗할 수 없습니다.');

답변 3

1

terecal님의 프로필 이미지
terecal
질문자

답변 감사합니다

알려주신대로 하니까 일단 에러 메세지를 얻어올수 있었어여

에러 메세지를 스테이트 변수에 저장하고 그리고 알림 메세지가

한번만 출력되도록 하기 위해 아래처럼 고쳤습니다 

리트윗 에러 발생시 알림 한번만 출력 되도록 하기

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

yield call에서 403에러가 나면 바로 catch로 갑니다. retweet after가 안 실행되는 게 당연합니다.

draft.retweetError = action.error.response.data로 해보세요.

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

노트로 정리하시니 매우 좋네요~ ^^

terecal님의 프로필 이미지
terecal

작성한 질문수

질문하기