Skip to content

Commit 0c282fe

Browse files
committed
fix: improve error handling in EventFormClient and Axios interceptor to provide more detailed error messages
1 parent 987d7a4 commit 0c282fe

3 files changed

Lines changed: 79 additions & 16 deletions

File tree

apps/ticket-admin/src/app/events/create/_clientBoundary/EventFormClient/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,8 +622,9 @@ export function EventFormClient() {
622622
console.log(error);
623623

624624
if (isAxiosErrorResponse(error)) {
625-
alert("이벤트 생성 중 오류가 발생했습니다. 다시 시도해주세요.\n" + error.message);
626-
console.error("Error creating event:", error);
625+
alert(
626+
"이벤트 생성 중 오류가 발생했습니다. 다시 시도해주세요.\n" + error.response?.data.message,
627+
);
627628
}
628629
} finally {
629630
setIsSubmitting(false);

apps/ticket-admin/src/lib/axios/index.ts

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,20 @@ instance.interceptors.response.use(
3838
// Server에서는 기본 전파
3939
console.error(error);
4040

41+
if (error?.response?.data) {
42+
return Promise.reject({
43+
...error,
44+
response: {
45+
...error.response,
46+
data: error.response?.data,
47+
},
48+
});
49+
}
50+
4151
return Promise.reject(error);
4252
}
4353

44-
console.error("##error", JSON.stringify(error));
45-
46-
if (isAxiosErrorResponse(error.response?.data)) {
54+
if (isAxiosErrorResponse(error)) {
4755
// 엑세스 토큰 없음
4856
if (
4957
error.response?.data.code === ERROR_CODE.NO_ACCESS_TOKEN ||
@@ -81,6 +89,16 @@ instance.interceptors.response.use(
8189
const originalRequest = error.config;
8290

8391
if (!originalRequest) {
92+
if (error?.response?.data) {
93+
return Promise.reject({
94+
...error,
95+
response: {
96+
...error.response,
97+
data: error.response?.data,
98+
},
99+
});
100+
}
101+
84102
return Promise.reject(error);
85103
}
86104

@@ -89,17 +107,33 @@ instance.interceptors.response.use(
89107
if (typeof window !== "undefined") {
90108
redirectToLoginOnce();
91109

92-
return Promise.reject(error?.response?.data);
110+
if (error?.response?.data) {
111+
return Promise.reject({
112+
...error,
113+
response: {
114+
...error.response,
115+
data: error.response?.data,
116+
},
117+
});
118+
}
119+
120+
return Promise.reject(error);
93121
}
94122
}
95123
}
96124
}
97125

98-
if (error.response?.status === 500) {
99-
return Promise.reject(error?.response?.data);
126+
if (error?.response?.data) {
127+
return Promise.reject({
128+
...error,
129+
response: {
130+
...error.response,
131+
data: error.response?.data,
132+
},
133+
});
100134
}
101135

102-
return Promise.reject(error?.response?.data);
136+
return Promise.reject(error);
103137
},
104138
);
105139

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,43 @@
1-
export type AxiosErrorResponse = {
1+
import { AxiosError } from "axios";
2+
3+
import { ERROR_CODE } from "@/lib/axios/utils/errorCode";
4+
5+
type ErrorResponse = {
26
code: number;
37
message: string;
48
};
59

10+
export type AxiosErrorResponse = AxiosError<ErrorResponse>;
11+
612
export function isAxiosErrorResponse(error: unknown): error is AxiosErrorResponse {
13+
if (error === null || typeof error !== "object") {
14+
return false;
15+
}
16+
17+
const hasOwnproperty = Object.prototype.hasOwnProperty;
18+
719
return (
8-
typeof error === "object" &&
9-
error !== null &&
10-
"code" in error &&
11-
"message" in error &&
12-
typeof (error as AxiosErrorResponse).code === "number" &&
13-
typeof (error as AxiosErrorResponse).message === "string"
20+
hasOwnproperty.call(error, "isAxiosError") ||
21+
(hasOwnproperty.call(error, "config") &&
22+
hasOwnproperty.call(error, "request") &&
23+
hasOwnproperty.call(error, "response"))
1424
);
1525
}
26+
27+
export function isNotAuthErrorResponse(error: unknown): error is AxiosErrorResponse {
28+
return (
29+
isAxiosErrorResponse(error) &&
30+
(error.response?.data.code === ERROR_CODE.NO_ACCESS_TOKEN ||
31+
error.response?.data.code === ERROR_CODE.REFRESH_TOKEN_EXPIRED)
32+
);
33+
}
34+
35+
export function isAuthError(error: Error): error is AxiosErrorResponse {
36+
return (
37+
isAxiosErrorResponse(error) && error.response?.data.code === ERROR_CODE.ACCESS_TOKEN_EXPIRED
38+
);
39+
}
40+
41+
export function isNetworkError(error: Error): error is AxiosErrorResponse {
42+
return isAxiosErrorResponse(error) && (error.response?.status ?? 0) >= 400;
43+
}

0 commit comments

Comments
 (0)