codestates / codestates/DEVzine-port

[ERROR LOG] Redis command 가 계속 undefined 값을 반환하는 문제

Open
#175 0 comments 0 reactions 1 assignee Claimed by @vodkamitlime View on GitHub
@vodkamitlime/ code for life 🍷 Error
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.