Skip to content

Commit 1e8671b

Browse files
authored
[25. 04. 02 / TASK-160] Modify - Sentry 401 감지 문제 해결 (#28)
* modify: 401 오류 관련 문제 해결 * modify: 타입 문제 해결 * modify: 만료된 토큰 관련 오류 해결
1 parent 2a868a6 commit 1e8671b

File tree

2 files changed

+67
-75
lines changed

2 files changed

+67
-75
lines changed

Diff for: src/__mock__/handlers.ts

+47-56
Original file line numberDiff line numberDiff line change
@@ -8,68 +8,59 @@ const BASE_URL = env.BASE_URL + '/api';
88
const login = http.post(`${BASE_URL}${PATHS.LOGIN}`, async ({ request }) => {
99
const { accessToken, refreshToken } = (await request.json()) as LoginVo;
1010
if (accessToken === 'invalid_access' && refreshToken === 'invalid_refresh') {
11-
return BaseError(404, '정상적인 토큰이 아닙니다');
11+
return BaseError(404, '잘못된 토큰입니다');
1212
}
1313
return BaseSuccess(null);
1414
});
1515

16-
const summary = http.get(
17-
`${BASE_URL}${PATHS.SUMMARY}`,
18-
async ({ request: { headers } }) => {
19-
if (!headers.get('access_token') && !headers.get('refresh_token')) {
20-
return BaseError(401, '잘못된 토큰입니다');
21-
}
22-
return BaseSuccess({
23-
stats: {
24-
lastUpdatedDate: '2025-01-09T00:00:00Z102',
25-
totalLikes: 100,
26-
totalViews: 100,
27-
yesterdayLikes: 50,
28-
yesterdayViews: 50,
29-
},
30-
totalPostCount: 10,
31-
});
32-
},
33-
);
16+
const summary = http.get(`${BASE_URL}${PATHS.SUMMARY}`, async ({ request: { headers } }) => {
17+
if (!headers.get('access_token') && !headers.get('refresh_token')) {
18+
return BaseError(401, '잘못된 토큰입니다');
19+
}
20+
return BaseSuccess({
21+
stats: {
22+
lastUpdatedDate: '2025-01-09T00:00:00Z102',
23+
totalLikes: 100,
24+
totalViews: 100,
25+
yesterdayLikes: 50,
26+
yesterdayViews: 50,
27+
},
28+
totalPostCount: 10,
29+
});
30+
});
3431

35-
const me = http.get(
36-
`${BASE_URL}${PATHS.ME}`,
37-
async ({ request: { headers } }) => {
38-
if (!headers.get('access_token') && !headers.get('refresh_token')) {
39-
return BaseError(401, '잘못된 토큰입니다');
40-
}
41-
return BaseSuccess({
42-
43-
id: '111111-111111-111111-111111',
44-
profile: { thumbnail: undefined },
45-
username: 'test',
46-
});
47-
},
48-
);
32+
const me = http.get(`${BASE_URL}${PATHS.ME}`, async ({ request: { headers } }) => {
33+
if (!headers.get('access_token') && !headers.get('refresh_token')) {
34+
return BaseError(401, '잘못된 토큰입니다');
35+
}
36+
return BaseSuccess({
37+
38+
id: '111111-111111-111111-111111',
39+
profile: { thumbnail: undefined },
40+
username: 'test',
41+
});
42+
});
4943

50-
const posts = http.get(
51-
`${BASE_URL}${PATHS.POSTS}`,
52-
async ({ request: { headers } }) => {
53-
if (!headers.get('access_token') && !headers.get('refresh_token')) {
54-
return BaseError(401, '잘못된 토큰입니다');
55-
}
56-
return BaseSuccess({
57-
nextCursor: '2025-01-09T00:00:00Z102,10',
58-
posts: [
59-
{
60-
createdAt: '2025-01-01T01:01:01Z103',
61-
id: '1',
62-
likes: 100,
63-
releasedAt: '2025-01-09T00:00:00Z102',
64-
title: 'test title',
65-
views: 100,
66-
yesterdayLikes: 100,
67-
yesterdayViews: 100,
68-
},
69-
],
70-
});
71-
},
72-
);
44+
const posts = http.get(`${BASE_URL}${PATHS.POSTS}`, async ({ request: { headers } }) => {
45+
if (!headers.get('access_token') && !headers.get('refresh_token')) {
46+
return BaseError(401, '잘못된 토큰입니다');
47+
}
48+
return BaseSuccess({
49+
nextCursor: '2025-01-09T00:00:00Z102,10',
50+
posts: [
51+
{
52+
createdAt: '2025-01-01T01:01:01Z103',
53+
id: '1',
54+
likes: 100,
55+
releasedAt: '2025-01-09T00:00:00Z102',
56+
title: 'test title',
57+
views: 100,
58+
yesterdayLikes: 100,
59+
yesterdayViews: 100,
60+
},
61+
],
62+
});
63+
});
7364

7465
export const handlers = [login, summary, me, posts];
7566

Diff for: src/apis/instance.request.ts

+20-19
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const instance = async <I, R>(
4949
input: URL | RequestInfo,
5050
init?: InitType<I>,
5151
error?: Record<string, Error>,
52-
): Promise<R> => {
52+
): Promise<R | void> => {
5353
let cookieHeader = '';
5454
if (typeof window === 'undefined') {
5555
cookieHeader = (await import('next/headers')).cookies().toString();
@@ -68,7 +68,7 @@ export const instance = async <I, R>(
6868
signal: AbortSignal.timeout
6969
? AbortSignal.timeout(Number(env.ABORT_MS))
7070
: abortPolyfill(Number(env.ABORT_MS)),
71-
credentials: 'include',
71+
credentials: input !== '/login' ? 'include' : 'omit',
7272
cache: 'no-store',
7373
});
7474

@@ -77,25 +77,26 @@ export const instance = async <I, R>(
7777
const context = err as Response;
7878
if (location && !context.ok && context.status === 401) {
7979
window.location.replace('/');
80-
}
81-
setContext('Request', {
82-
path: context.url,
83-
status: context.status,
84-
});
85-
if ((err as Error).name === 'TimeoutError') {
86-
captureException(new ServerNotRespondingError());
87-
throw new ServerNotRespondingError();
8880
} else {
89-
if (!error?.[`${(err as Response).status}`]) {
90-
const serverError = new Error(
91-
`서버에서 예기치 않은 오류가 발생했습니다. (${(err as Error).name})`,
92-
);
93-
captureException(serverError);
94-
throw serverError;
95-
}
81+
setContext('Request', {
82+
path: context.url,
83+
status: context.status,
84+
});
85+
if ((err as Error).name === 'TimeoutError') {
86+
captureException(new ServerNotRespondingError());
87+
throw new ServerNotRespondingError();
88+
} else {
89+
if (!error?.[`${(err as Response).status}`]) {
90+
const serverError = new Error(
91+
`서버에서 예기치 않은 오류가 발생했습니다. (${(err as Error).name})`,
92+
);
93+
captureException(serverError);
94+
throw serverError;
95+
}
9696

97-
captureException(error[`${(err as Response).status}`]);
98-
throw error[`${(err as Response).status}`];
97+
captureException(error[`${(err as Response).status}`]);
98+
throw error[`${(err as Response).status}`];
99+
}
99100
}
100101
}
101102
};

0 commit comments

Comments
 (0)