나는 /upload로 라우터 요청이 들어오기 전에 인증되도록 설정해뒀다. 그렇기 때문에 캐시된 데이터가 있다면 router로 넘어가도록 아래와 같이 로직을 작성했다.
// 캐시된 데이터가 있다면 router로 넘어가기
if(cachedData) {
return next();
} else { // 캐시된 데이터가 없다면 DB에서 조회
const result = await deviceRepository.findDeviceNameByOwnerId(req.headers.device_owner, req.headers.device_name, dbConnection);
if (result.length > 0 && result[0].http_token == uuidToken) {
logger.info(`Token validation successful for device owner: ${req.headers.device_owner} and device name: ${req.headers.device_name}`);
// DB 조회 결과를 Redis에 저장
await setAsync(cashedKey, 1800, JSON.stringify(result[0])); // 30분 동안 캐시 유지
return next();
} else {
throw new Error('HTTP auth (token) error')
}
}
cachedData
결과는 null이다.await setAsync()
함수에서 문제가 생겨 다음 라우터로 넘어가지 않는 것 같았다.// 기존 코드
await setAsync(cashedKey, 1800, JSON.stringify(result[0]));
// 변경 후 코드
await setAsync(cashedKey, JSON.stringify(result[0]), 'EX', 1800);
setAsync
함수에 전달하는 인자는 setAsync(key, value, 'EX', expiration)
의 형태로 사용되어야 한다.JSON.stringify(result[0])
을 실행하면 나오는 결과를 살펴보자.{
device_owner: 'owner123',
device_name: 'deviceABC',
http_token: 'uuidToken123'
}
JSON.stringify(result[0])
를 실행하면, 위 객체는 다음과 같은 JSON 문자열로 변환된다."{\"device_owner\":\"owner123\",\"device_name\":\"deviceABC\",\"http_token\":\"uuidToken123\"}"