Nodejs 외부 함수에서 리턴 값 undefined 해결

권민제·2021년 6월 26일
1

Nodejs

목록 보기
1/3
post-thumbnail

내가 주로 사용하고 있는 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);
           }
       }
   }
profile
성장하는 개발자!

0개의 댓글