/************************
* 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