될때까지

((TIL)) 프리온보딩 백엔드 사전스터디 : Node.js 3 본문

프로젝트/프리온보딩

((TIL)) 프리온보딩 백엔드 사전스터디 : Node.js 3

랖니 2022. 9. 25. 20:12
728x90

배열에 담아 반환되는 쿼리의 실행 결과, 깔끔하게 코드에 적용하기

const user = await myDataSource.query(`
        select 
            id, 
            email,
            nickname,
            password
        from
            users
        where
            email = ?`, [email])

    console.log('user', user)

해당 query의 결과 user를 콘솔에 찍어보면 아래와 같이 배열에 담겨서 반환된다.

user [
  {
    id: 1,
    email: 'codekim@justcode.co.kr',
    nickname: 'codeKim',
    password: 'c0dek!m'
  }
]

배열안에 객체로 담겨서 반환되기 때문에 유저의 유무를 체크할 때도 .length === 0을 사용해서 비교했다.

    // 없다 => 없는 유저다
    if (user.length === 0) {
        console.log('NO_USER')
    }

유저가 있다면 bcrypt.compareSync()를 사용해서 비교해야 하는데 이때 첫번째 인자로는 입력한 비밀번호, 두번째 인자는 DB에 저장된 비밀번호가 들어간다. 그러면 true, false로 결과값을 리턴해주는데 user의 쿼리 결과가 배열로 반환되기 때문에 꼭 뒤에 [0]이라는 인덱싱을 사용해서 코드를 적었다.

    // 있다 => 유저 데이터 및 유저 비밀번호 디비에서 꺼내오기
    bcrypt.compareSync(password, user[0].password)

하지만, 아래처럼 쿼리의 결과 user를 대괄호 [] 안에 담아주면 언패킹이 되서 배열 없이 반환되고 코드가 쪼금 깨끗해졌다 👍

    const [user] = await myDataSource.query(`
        select 
            id, 
            email,
            nickname,
            password
        from
            users
        where
            email = ?`, [email])

	...생략...
    
    bcrypt.compareSync(password, user.password)

 

Object.keys()

객체가 가지고 있는 key값의 이름들을 배열로 반환한다.

const hasKey = { password : false, username : false };
const requireKey = Object.keys(hasKey);  

console.log('requireKey', requireKey);
// requireKey [ 'password', 'username' ]
728x90