글로벌 예외 처리

3380 단어

절단면 프로그래밍


예외 처리는 다음과 같습니다.
알려진 오류: 전방 요청 데이터 형식 검사 오류 등 알 수 없는 오류: 코드 문법 오류, 환경 오류 등
알 수 있는 오류: 모델 층에 아래에 표시된 이상 오류 클래스를 도입하여 업무 수요에 따라 지정한 오류 클래스를 제거한 다음 전역적으로 이상 차단 처리를 하고 클라이언트로 돌아갑니다
201: 조회 성공 200: 제출 성공 403: 접근 금지 참조: 디지털 코드 설정 응답 상태 성명된 이상 오류 클래스 참조:
  • Error
  • 에 선언된 예외 보고 클래스 상속
    class HttpException extends Error{
        constructor(msg='     ',errorCode=10000, code=400){
            super()
            this.errorCode = errorCode
            this.code = code
            this.msg = msg
        }
    }
    
    class Success extends HttpException{
        constructor(msg, errorCode){
            super()
            this.code = 201
            this.msg = msg || 'ok'
            this.errorCode = errorCode || 0
        }
    }
    
    class AuthFailed  extends HttpException {
        constructor(msg, errorCode) {
            super()
            this.msg = msg || '    '
            this.errorCode = errorCode || 10004
            this.code = 401
        }
    }
    

    클라이언트 예외 반환 형식:
    ctx.body = {
        msg:error.msg,
        error_code:error.errorCode,
        request:`${ctx.method} ${ctx.path}`
      }
    ctx.status = error.code
    

    models 계층에서 선언된 예외 오류 클래스를 도입합니다.
    class User extends Model {
        static async verifyEmailPassword(email, plainPassword) {
            const user = await User.findOne({
                where: {
                    email
                }
            })
            if (!user) {
                throw new global.errs.AuthFailed('     ')
            }
            // user.password === plainPassword
            const correct = bcrypt.compareSync(
                plainPassword, user.password)
            if(!correct){
                throw new global.errs.AuthFailed('     ')
            }
            return user
        }
    
        static async getUserByOpenid(openid){
            const user = await User.findOne({
                where:{
                    openid
                }
            })
            return user
        }
    
        static async registerByOpenid(openid) {
            return await User.create({
                openid
            })
        }
    }
    

    전역 예외 처리 차단: (중간부품 Middlewares)
  • 이곳의 미지의 오류 이상 처리는 개발 환경인지 생산 환경인지 구분해야 한다.
  • 개발 환경이고 미지의 이상이면 cmd단에 던져서 개발할 때 이상 오타 위치를 쉽게 정할 수 있다.
  • 만약에 생산 환경이 알 수 없는 이상 보고가 틀리면 cmd단에서 이상을 던지지 않고 클라이언트가status500을 되돌려주면 코드가 계속 실행되는 것이지 사이트의 다른 기능의 정상적인 운행에 영향을 주지 않는다.
  • const {HttpException} = require('../core/http-exception')
    
    const catchError = async (ctx, next)=>{
        try {
            await next()
        } catch (error) {
            //     
            //     
            //        HttpException
            const isHttpException = error instanceof HttpException
            const isDev = global.config.environment === 'dev'
            
            if(isDev && !isHttpException){
                throw error
            }
            
            if(isHttpException){
                ctx.body = {
                    msg:error.msg,
                    error_code:error.errorCode,
                    request:`${ctx.method} ${ctx.path}`
                }
                ctx.status = error.code
            }
            else{
                ctx.body = {
                    msg: 'we made a mistake O(∩_∩)O~~',
                    error_code: 999,
                    request:`${ctx.method} ${ctx.path}`
                }
                ctx.status = 500
            }
        }
    }
    
    module.exports = catchError
    

    글로벌 예외 처리 주입:
    app.use(catchError)
    

    좋은 웹페이지 즐겨찾기