next error 핸들링

Posted by : on

Category : nextJs   react


try & catch 말고!

page.tsx에 error.tsx를 만들어서 에러페이지를 만들면 됨!

'use client'
import {useEffect} from "react"
export default function Error({
    error,
    reset,
                              }:{
    error:Error;
    reset:()=>void;
                              }){
    useEffect(()=>{
        console.error(error.message);
    },[error]);
    return (
        <div>
            에러발생!!
            <button onClick={()=> reset()}>다시 시도</button>
        </div>
    )
}


여기서 reset함수도 넘어오게 되는데 이 reset은 다시한번 시도 할수 있게 해주는 함수이다. 서버측에 대한것을 시도하는 것은 아니고 클라이언트에서 발생한 오류만 처리한다. 그래서 그냥 window.loaction.reload()를 쓰는게 나을수도 있다.


'use client'
import {useEffect} from "react"
export default function Error({
    error,
    reset,
                              }:{
    error:Error;
    reset:()=>void;
                              }){
    const router = useRouter();
    useEffect(()=>{
        console.error(error.message);
    },[error]);
    return (
        <div>
            에러발생!!
            <button onClick={()=> {
                startTransition(()=>{
                    router.refresh();
                    reset();
                })
            }
            }>다시 시도</button>
        </div>
    )
}

router.refresh(); - 현재 페이지에 필요한 서버컴포넌트를 다시 불러옴 reset(); - 에러 상태를 초기화, 컴포넌트들을 다시 렌더링

이 두개를 같이쓰면 좋다.

startTransition

이건 리액트 18부터 추가된 기능으로 router.refresh(); <- 이게 비동기처리가 된다. 그래서 순서대로 실행하게 해야하는데 reset();

async await는 refresh에서 사용할 수 없다. 프라미스를 반환하지 않기 때문이다. 그래서 사용하게 된것이 startTransition이다. 이걸 쓰면 순서대로 일괄적으로 처리 된다.


About 유재석
유재석

개발자 유재석 입니다. Web Developer.

Email : jaeseok9405@gmail.com

Website : https://github.com/yoo94