| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /************************
- * import
- ************************/
- const useErrorHandler = () => {
- const { $log, $toast, $eventBus } = useNuxtApp()
- // 공통 에러코드
- let errProfiles = [
- { code : '9999' , action : 0, desc : '기타오류', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.<br/> 지속발생시 관리자에게 문의 바랍니다.'}, after : null}
- ]
- let errObj = { code : '' , action : 0, desc : '', proc : {type:'toast',msg:'처리중 오류가 발생되었습니다.<br/>상세오류코드: '}, 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
|