wrap 함수

윤여빈·2024년 9월 30일

아이템 시뮬레이터를 만든 결과,
핸들러를 try-catch문을 통해 같은 형태로 에러를 대비하였다.
같은 형태로 반복된다면 함수 형태로 만들면 좋을 것 같다는 피드백을 받고
wrap 함수를 만들어보았다.

[wrap]

export const wrap = (func) => {
    return (async (req, res, next) => {
        try {
            return await func(req, res, next)
        } catch (error) {
            return next(error)
        }
    })
}

wrap 함수는 비동기 함수를 인자로 받으며,
비동기 함수(인자)를 try-catch문을 통해 실행한 결과 값을 리턴해주는 함수이다.
에러가 있을 경우에는 next 메서드를 통해 에러를 처리해준다.

[핸들러]

router.post('/character', wrap(async (req, res, next) => {
    const character_name = req.body.character_name;
    const { user } = req;
    const exist_character_name = await prisma.character.findFirst({ where: { character_name: character_name } });
    if (exist_character_name) {
        res.status(400).json({ error: '이미 존재하는 캐릭터 이름입니다.' });
    }
    await prisma.character.create({
        data: {
            character_name,
            user_id: user.user_id,
        }
    });
    return res.status(200).json({ data: user.user_id });
}));

위와 같이 기존 핸들러(비동기 함수)에 wrap 함수로 감싸주어 핸들러(비동기함수)의
에러를 wrap 함수의 next 메서드를 통해 처리할 수 있다

모든 핸들러의 try-catch문을 간단하게 wrap로 감싸주면서
코드의 가독성을 높일 수 있게 되었다!

0개의 댓글