인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

1-blue님의 프로필 이미지
1-blue

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

해시태그 검색하기

async, await, promise관련질문입니다

작성

·

199

0

안녕하세요 강의대로 전부 만들고 추가로 책에서 추천해주신 기능들 구현하다가 약간의 문제가 생겨서 질문드립니다.

현재 만들던게 로그인일때랑 프로필변경할때 닉네임중복체크를하고 중복되면 사용자에게 알려주려고 합니다.

닉네임중복처리하는부분이 회원가입할때 프로필변경할때 2번사용이되서 따로 함수로 빼서 require해서 처리하려고 따로만들었는데요 코드보면

// 닉네임중복체크 : 중복시 true반환
exports.nicknameOverlapCheck = async (nick=> {
    const exUserNick = await User.findOne({ where: { nick } });
    if (exUserNick) {
        return true;
    }
    return false;
}

위와같이 만들었습니다. 처음 생각했던방식이 boolean반환형식이니까 사용하는곳에서 if(nicknameOverlapCheck(nick)){ res.redirect()....} 이런식으로사용하려고했는데 오류나서 확인해보니 async함수일경우에는 자동으로 return값이 Promise.resolve(true)이런식으로 감싸져서 리턴되기때문에 오류나서 aysnc를 뺄순없고

받는곳에서 .then(( bool)=>{ if(bool){return res.redirect() ... } }) 처리로 바꿔보니 이것도 콜백함수에서 빠져나가는 리턴이 되어버려서 현재는 그냥 사용하는곳에서 직접 적어줘서 처리를 하고 있습니다. 물론 두번밖에 반복안되서 크게 상관없지만 이런반복이 개인적으로 불편해서 함수로 만들어서 처리하고 싶습니다. 혹시 async함수에서 값을 함수밖으로 받아오는 좋은방법이 있을까요?

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

.then(( bool)=>{ if(bool){return res.redirect() ... } }) 이렇게 하는게 맞습니다. 아마 다른 이유로 안 되셨을 겁니다.

.then 보다는 async/await 쓰시는 게 좀 더 나을겁니다.

const result = await nicknameOverlapCheck(nick);
if (result) {
  return res.redirect();
}

1-blue님의 프로필 이미지
1-blue

작성한 질문수

질문하기