내가 주로 사용하고 있는 Nodejs Express 환경에서 내가 겪었던 문제 중에 하나였던
비동기식 처리를 할 때 외부함수를 사용하여 리턴 값을 받을 때 값을 못받는 문제가 Nodejs 환경에서 개발하면서 종종 발생할 것이다
✅ 예시
상황 post함수 안에서 redis서버에서 get을 하는 외부함수에서 리턴 값을 받아와야하는 상황
server.post("/user/promise/test", (req,res) => {
let RedisResult = getRedisData(req.body.user_email);
res.send({
redis_result : RedisResult
})
)
getRedisData = (email) => {
redisClient.get(email,(err, result) => {
if(err) throw err;
return result;
}
}
위에 상황대로 실행된다면 res.send에서 redis_result값이 출력되지 않을 것이다
각 함수마다 RedisResult를 콘솔로 출력한다면 getRedisData 함수안에서는 제대로 값이 출력되지만 정작 server.post에서는 출력이 안될 것이다.
🤷 왜 값이 안뜰까
답은 비동기식 처리방법에 있다
post 요청을 받고 안에서 분명히 getRedisData를 호출하여 리턴 값을 요청했지만
비동기식 처리로 인해 getRedisData의 리턴을 기다리지 않고 res.send요청을 실행해서 이런 결과가 발생한 것이다
👨🏻💻 해결방법
⚠외부함수로 부터 리턴을 받기 위해서는 Promise형식으로 작성해야한다⚠
Promise형태에서 async await 사용
await를 사용하여 getRedisData의 리턴을 기다려주게 된다!
⚠await를 사용할 시에 무조건 함수에 async 추가해야한다⚠
server.post("/user/promise/test", async(req,res) => {
let RedisResult = await getRedisData(req.body.user_email);
res.send({
redis_result : RedisResult
});
)
getRedisData = (email) => {
return new Promise((resolve, reject) => {
redisClient.get(email,(err, result) => {
if(err) reject(err);
resolve(result);
}
}
}