codestates / codestates/DEVzine-port
[ERROR LOG] Redis command 가 계속 undefined 값을 반환하는 문제
- Dominant language
- JavaScript
- Stars
- 1
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
## Error Type
- 에러는 아니지만, redisClient 메서드를 활용하여 내부에서 return 구문을 작성할 경우 함수 호출 시 반환값이 undefined 인 문제 계속 발생
```js
redisClient.hgetall('recentArticles', async (err, articles) => {
if (err) {
return err;
}
// cache miss
if (!articles) {
const articlesFromDB = await getArticlesPastTwoWeeks();
return [articlesFromDB, 'DB'];
}
// cache hit
if (articles) {
let articleData = [];
for (let key in articles) {
articleData.push(JSON.parse(articles[key]))
}
return [articleData, 'cache'];
}
```
## Solution
- 원인: Redis 메서드는 기본적으로 promise 를 반환하는데, 내부에 있는 값이 resolve 가 되지 않은채 함수가 호출되어 계속 pending 상태였던 것.
- new Promise 를 생성하여 redis method 를 호출하고, 결과물을 resolve 해주니 async await 을 통해 원하는 값을 받아올 수 있음
```js
const checkCacheForArticles = async () => {
return new Promise((resolve, reject) => {
redisClient.hgetall('recentArticles', async (err, articles) => {
if (err) {
reject(err);
}
// cache miss
if (!articles) {
const articlesFromDB = await getArticlesPastTwoWeeks();
resolve(articlesFromDB, 'DB');
}
// cache hit
if (articles) {
let articleData = [];
for (let key in articles) {
articleData.push(JSON.parse(articles[key]))
}
resolve(articleData, 'cache');
}
});
})
}
```
## Reference
- [Parse Redis HGETALL object in Node.js](https://stackoverflow.com/questions/8086448/parse-redis-hgetall-object-in-node-js/8087040)
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.