2020년 01월 08일
axios로 개발할 때, API마다 try ~ catch문을 적용하여 에러 처리를 진행해왔습니다.
이번 프로젝트에서는 Token을 관리하며, 서버에서 403에러가 오면 Token을 재발행해야하는 환경이라 더 나은 코드가 없을까 찾아보니 interceptors가 있었습니다.
axios.interceptors 함수를 통해 request, response를 감지할 수 있습니다.
// API 호출 전 해당 함수가 먼저 실행됩니다.
axios.interceptors.request.use(
(config) => {
return config;
},
(error) => {
return Promise.reject(error);
}
);
// API 실행 후 response를 감지하여 데이터를 return 합니다.
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
return Promise.reject(error);
}
);
위 예제처럼 interceptors.response
를 통하여 에러를 감지할 수 있게됩니다.
그러면 다시 response에 에러처리를 위해 코드를 작성합니다.
const _axios = axios.create({
baseURL: process.env.REACT_APP_API_URL,
});
_axios.interceptors.response.use(
(response) => response,
(error) => {
if (error.response && error.response.status === 403) {
return Auth.refreshToken() // token 재발행 및 반환
.then((token) => {
originalRequest.headers["Authorization"] = token;
return _axios.request(error.config); // error.config(origin API 정보)를 다시 요청
})
.catch((error) => {
window.location.href = "/login";
});
}
return Promise.reject(error);
}
);
_axios
가 호출되면 403에러를 감지할 수 있도록 작성합니다.refreshToken()
에서 token을 전달받아 header에 추가origin API 정보가 들어있는 error.config
로 기존 API 재호출예를 들면 아래와 같이 API를 호출했을 때 403에러가 나타나도 interceptors에서 정상적으로 값을 return하면 API 호출하는 부분에서는 정상적인 값이 들어옵니다.
const result = await _axios.get(url); // 403에러가 나타나도 interceptors의 return 값을 가져옴
return result;
감사합니다.
2021년 02월 04일
# 공식문서 AOS/iOS 에뮬레이터 설치 https://reactnative.dev/docs/environment-setup ## error Failed to install the app > error Failed to install the app. Make sure you have an Android emulator running or a > device connected. Run CLI with --verbose flag for more details. 1. `bash chmod 755 android/gradlew` 실행 2. emulator -list-avds 리스트 뜨는지 확인 3. ~/.bash_profile 또는 ~/.zshrc 에 path 정상 등록되어있는지 확인 > Task :app:stripDebugDebugSymbols UP-TO-DATE > Compatible side by side NDK version was not found. > Task :app:installDebug FAILED Android Studio -> Configure -> SDK Manager -> SDK Tools -> NDK 설치 ## Failed to run jetifier ```bash yarn yarn add -D jetifier npx jetify npx react-native run-android ``` or ```bash react-native run-android --no-jetifier ```
2020년 01월 17일
채팅과 같이 메시지가 도착하면 최하단으로 계속 이동해야하는 경우나 단순 최하단으로 이동하고 싶을 때 구현하는 방법입니다. ## 자바스크립트에서 스크롤 하단으로 이동 엘리먼트의 height만큼 scroll 위치를 이동합니다. ```js // overflow 스크롤이 걸려있는 엘리먼트 const ele = document.querySelector("ul"); ele.scrollTop = ele.scrollHeight; ``` ## React에서 응용하기 React에서 채팅 레이아웃에서 메시지가 들어올 때마다 최하단으로 이동하는 코드입니다. ```tsx import React, { useRef, useEffect } from 'react'; import { useMessages } from 'Hooks'; ... const messagesRef = useRef(null); // 메시지 엘리먼트를 저장 const { messages } = useMessages(); // Custom Hooks : 메시지 리스트 useEffect(() => { messagesRef.current!.scrollTop = messagesRef.current!.scrollHeight; }, [messages]); ... return ( {messages.map(message => { return ( ... ); })} ; ) ``` firebase를 사용하고 있으며, 메시지를 구독하면 useMessages에서 messages를 내려줍니다. 이후 messages가 업데이트될 때 마다, ul 엘리먼트를 최하단으로 이동합니다. 만일 특별하게 최하단으로 이동하기 싫으시다면, useEffect 내에 if문으로 조건을 설정하시면 됩니다.
2020년 01월 08일
HTML Event 키보드 관련 이벤트 ( keyup ) document.addEventListener("keyup", (event: KeyboardEvent) => { console.log(event.keyCode); }); React React.cloneElement type ReactText = string | number; type ReactChild = ReactElement<any> | ReactText; return React.cloneElement(child as React.ReactElement<any>, { width: this.props.width, height: this.props.height, }); react-router-dom history import { RouteComponentProps } from 'react-router-dom'; interface Props extends RouteComponentProps<any> {} const Component : React.FC<Props> = ({ history }) => ();