Node.js 커스텀 에러처리, 에러 미들웨어 적용

mj·2025년 1월 13일
0

ktb

목록 보기
20/27

기존 코드

/models/userModel.js

export const createUser = async (newUser) => {

    const { userId, email, password, nickname, profileImage } = newUser;
    
    try{
        await pool.query(`
            INSERT INTO user (user_id, email, password, nickname, profile_image)
            VALUES (?, ?, ?, ?, ?)
            `,
            [userId, email, password, nickname, profileImage]
        );

    }catch(error){
      // 에러 발생
        throw error;
    }
};

/controllers/usersController.js

export const getUserProfileController = async (req, res) => {
    try{
        const userId = req.params.userId;
        const user = await getUserById(userId);

        res.status(200).json({
            message: "사용자 정보 조회 성공",
            data: {
                email: user.email,
                nickname: user.nickname,
                profileImage: user.profileImage || DefaultProfileImageName
            }
        });
    }catch(error){
      // 에러 처리
        console.log(error);
        res.status(500).json({message: "서버 에러 발생"});
    }
};

수정 이후 코드

/utils/customError.js

// CustomError 클래스 정의
export class CustomError extends Error {
    constructor(status, message) {
        super(message);
        this.status = status;
    }
}

/middleware/errorMiddleware.js

export const errorHandler = (err, req, res, next) => {
    const timestamp = new Date().toISOString();
    console.error(
        `[${timestamp}] ${req.method} ${req.originalUrl} | status: ${err.statusCode}, message: ${err.message}
          ${err.stack}`,
      );

    const status = err.status || 500;
    const message = err.message || "서버 에러 발생";

    return res.status(status).json({ message,});
};

/models/userModel.js

export const createUser = async (newUser) => {

    const { userId, email, password, nickname, profileImage } = newUser;
    
    try{
        await pool.query(`
            INSERT INTO user (user_id, email, password, nickname, profile_image)
            VALUES (?, ?, ?, ?, ?)
            `,
            [userId, email, password, nickname, profileImage]
        );

    }catch(error){
      // 커스텀 에러 발생
        throw new CustomError(500, "사용자 등록 실패");
    }
};

/controllers/usersController.js

export const getUserProfileController = async (req, res, next) => { // 인자에 next 추가
    try{
        const userId = req.params.userId;
        const user = await getUserById(userId);

        res.status(200).json({
            message: "사용자 정보 조회 성공",
            data: {
                email: user.email,
                nickname: user.nickname,
                profileImage: user.profileImage || DefaultProfileImageName
            }
        });
    }catch(error){
      // 에러 처리 : 에러처리 미들웨어로 넘김
        next(error);
    }
};

app.js

...
app.use('/api/auth', authRouter);
app.use('/api/posts', postsRouter);
app.use('/api/users', usersRouter);

// 에러처리 미들웨어 추가
app.use(errorHandler);

...
profile
일단 할 수 있는걸 하자.

0개의 댓글

관련 채용 정보