/************************ * import ************************/ const useErrorHandler = () => { const { $log, $toast, $eventBus } = useNuxtApp() // 공통 에러코드 let errProfiles = [ { code : '9999' , action : 0, desc : '기타오류', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.
지속발생시 관리자에게 문의 바랍니다.'}, after : null} ] let errObj = { code : '' , action : 0, desc : '', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.
상세오류코드: '}, after : null} /** * 공통 에러 처리 함수 * @param {*} error 에러 */ async function fnSetCommErrorHandle(error){ let code = '' let msg = '' if (error.response){ code = error.response.data.resCode msg = error.response.data.resMsg } //$log.error('[ErrorHandle][ERROR]' + JSON.stringify(error.response.data)) if(code === '1005' || code === '1006' || code === '1007' || code === '1008') { // 1005: 토큰이 없음, 1006: 토큰 만료됨, 1007: 잘못된 토큰 값, 1008: 로그아웃 처리된 토큰 값 => 강제 로그인 페이지로 이동 $eventBus.emit('SESSION_DESTORY') } // 에러로 처리 errObj.code = code if(_isEmpty(errObj.code)){ errObj = _find(errProfiles, {code:'9999'}) code = '9999' } if(errObj.proc.type === 'toast'){ let toastMsg = errObj.proc.msg toastMsg = errObj.proc.msg.concat(msg+'['+code+']') //$toast.error(toastMsg) } return false } // 새로운 포괄적 에러 처리 함수들 추가 const handleApiError = (error, context = '') => { console.error(`API 오류 [${context}]:`, error) let errorMessage = '서버 오류가 발생했습니다.' if (error.response) { const status = error.response.status const data = error.response.data switch (status) { case 400: errorMessage = data?.message || '잘못된 요청입니다.' break case 401: errorMessage = '인증이 필요합니다. 다시 로그인해주세요.' $eventBus.emit('SESSION_DESTORY') break case 403: errorMessage = '접근 권한이 없습니다.' break case 404: errorMessage = '요청한 리소스를 찾을 수 없습니다.' break case 422: errorMessage = data?.message || '입력 데이터를 확인해주세요.' break case 429: errorMessage = '요청이 너무 많습니다. 잠시 후 다시 시도해주세요.' break case 500: errorMessage = '서버 내부 오류가 발생했습니다.' break default: errorMessage = data?.message || `서버 오류가 발생했습니다. (${status})` } } else if (error.request) { errorMessage = '네트워크 오류가 발생했습니다. 인터넷 연결을 확인해주세요.' } else { errorMessage = error.message || '알 수 없는 오류가 발생했습니다.' } $toast.error(errorMessage) return { message: errorMessage, status: error.response?.status, data: error.response?.data } } const handleValidationError = (errors) => { if (Array.isArray(errors)) { errors.forEach(error => { $toast.error(error) }) } else if (typeof errors === 'object') { Object.values(errors).forEach(error => { if (Array.isArray(error)) { error.forEach(msg => $toast.error(msg)) } else { $toast.error(error) } }) } else { $toast.error(errors || '입력 데이터를 확인해주세요.') } } const handleFileError = (error, fileName = '') => { const prefix = fileName ? `[${fileName}] ` : '' if (error.name === 'FileSizeError') { $toast.error(`${prefix}파일 크기가 너무 큽니다. (최대 10MB)`) } else if (error.name === 'FileTypeError') { $toast.error(`${prefix}지원하지 않는 파일 형식입니다.`) } else if (error.name === 'FileReadError') { $toast.error(`${prefix}파일을 읽는 중 오류가 발생했습니다.`) } else { $toast.error(`${prefix}파일 처리 중 오류가 발생했습니다.`) } } const showConfirmDialog = (title, message, onConfirm, onCancel = null) => { const param = { id: 'confirmDialog', title: title, content: message, yes: { text: "확인", isProc: true, event: "CONFIRM_DIALOG_YES", param: null, }, no: { text: "취소", isProc: false, event: "CONFIRM_DIALOG_NO", param: null, }, } // 이벤트 리스너 정리 후 재등록 $eventBus.off("CONFIRM_DIALOG_YES") $eventBus.off("CONFIRM_DIALOG_NO") $eventBus.on("CONFIRM_DIALOG_YES", () => { if (onConfirm) onConfirm() $eventBus.off("CONFIRM_DIALOG_YES") $eventBus.off("CONFIRM_DIALOG_NO") }) $eventBus.on("CONFIRM_DIALOG_NO", () => { if (onCancel) onCancel() $eventBus.off("CONFIRM_DIALOG_YES") $eventBus.off("CONFIRM_DIALOG_NO") }) $eventBus.emit("OPEN_CONFIRM_POP_UP", param) } return { fnSetCommErrorHandle, handleApiError, handleValidationError, handleFileError, showConfirmDialog } } export default useErrorHandler