inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

bcrypt의 compare메서드의 리턴값이 계속 false로 나오는데요, 어떻게 하면 true를 반환할까요

800

프린이

작성한 질문수 21

0

안녕하세요, 제로초님!

bcrypt의 compare 함수의 return 값이 계속 false가 나와서, 혹시 제시해주실 힌트가 있으실지 글을 남겨봅니다

 

이와 관련해 구글링에서 제시한 방법들을 적용해봤는데도, 계속적으로 false가 리턴됩니다ㅠ…

 

: 1. password 타입의 length를 늘리기(데이터가 짤려서 출력될 수 있다고 하여,,)

: 2. password 타입을 string 타입으로 변환? 후 디비에 저장하기

: 3. pre 미들웨어를 사용할 경우, pre()특성상 반복적?으로 pwd를 해싱하기 때문에 isModified()/ .isNew() 일 경우를 추가하기

: 4. compare()함수의 인자를 작성시, 인자의 순서 체크 - 첫번째인자는 유저가 입력한것, 두번째는 hashed되어 디비에 저장된 패스워드로 입력하기

 

위와 같이 해결방법을 찾았는데요,,,

 

1,2번은 이미 mongoose에서 해결해주는 부분이라 패스하고,,,

3,4번은 적용을 했는데도 ㅠ

comprare함수의 리턴값이 false로 나옵니다,,,

 

compare함수의 리턴값이 false여도... 

false를 true라고;;; 조건식을 변경하면;;;;

입력한 값에 해당하는, json객체가 출력되어 문제는 없지만,,,,

(아래 authController.js파일,  !passwordMatch를 passwordMatch로 변경하면 원하는 로직대로 나오지만 ㅠ )

(폼에 입력한 값에 해당한, json객체가 나와서 문제는 없는데..)

 

 

false를 true라고 가정하고;; 

코드를 변경하면 원하는 결과를 얻게 되는데,,,

작성된 코드가 ,,,이건 아닌거 같아서요 ㅠ

 

왜 계속,,,false를 반환할까요,,;;

bcrypt말고 다른 라이브러리를 사용해야할까요??

 

감사합니다,

 

 

p.s) 

추가 질문입니다.

 

1. issModified(‘password’) || isNew()
User.js 내용 중

UserSchema.pre('save', async function () {…} 부분에서,

isModified(‘password’) || isNew() 이하 블록이 실행되는 조건은,

password가 변경되거나 처음 입력될 경우 실행되는 건지요,

제가 잘 이해하고 코드를 작성했는지 궁금합니다   

 

2. 에러 핸들링

bycript 공식홈페이지나 관련 코드를 구글링을 해보면, 코드를 콜백방식으로 작성한걸 심심치 않게 볼수 있는데요,

저는 async-await로 작성해서, 이걸어떻게 에러 핸들링 코드를 작성해야할까요?

try..catch로도 충분할까요?

 

--------------------------------------------------------------------------------------------------------------------------

 

User.js

import bcrypt from 'bcrypt';

import mongoose from 'mongoose';

 

const UserSchema = new mongoose.Schema(

  {

   …중략…

    password: {

      type: String,

      required: true,

      min: 6,

    },

    …중략…

  },

  { timestamps: true }

);

 

UserSchema.pre('save', async function () {

  try {

    const salt = await bcrypt.genSalt(10);

    if (this.isModified('password') || this.isNew()) {

      this.password = await bcrypt.hash(this.password, salt);

    }

  } catch (err) {

    console.log(err);

  }

});

 

const User = mongoose.model('User', UserSchema);

 

export default User;

 

 

authController.js

export const login = async (req, res) => {

  try {

    const {

      body: { email, password },

    } = req;

 

    const user = await User.findOne({ email: email });

 

    if (!user) { // user가 ! 없는것이 맞다(true)면 = user가 없다면

      return res.status(404).json({ error: 'user is not found' });

    } else {

      const passwordMatch = await bcrypt.compare(password, user.password);

     

      //부정문을 먼저 시작하는 조건식

     // passwordMatch가 false로 나와 계속 { error: 'Invalid Password' }를 출력

     // !passwordMatch에서 !을 제거하면 원하는 결과 도출

 

      if (!passwordMatch) { // match되는 password가 !없다는게 맞다(true)면   

        return res.status(400).json({ error: 'Invalid Password' });

      }

      return res.status(200).json(user);

    }

  } catch (err) {

    return res.status(401).json(err);

  }

 

};

 

 

 

 

bcrypt Sequelize mysql mongodb nodejs

답변 1

0

제로초(조현영)

salt를 왜 넣으시는거죠? 누구 코드를 보고 하시고 계신건가요? 제 강좌 코드를 따라하세요. 저도 제 코드가 아닌 부분은 모릅니다.

async await 에러는 try catch로 해결하시면 됩니다.

리눅스 노드 설치시 패키지

0

172

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

926

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2297

2

a[title] 질문드립니다

0

387

1

리뉴얼 강의 및 공부 방법

0

590

1

jwt decode

0

1138

1

node.js 교과서 3판 질문드립니다

0

397

1

passport와 jwt

0

438

1

리뉴얼 강의

0

428

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

359

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

490

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

511

2

nunjucks res.render('error'); 작동을 안합니다.

0

519

1

질문있습니다.

0

348

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3543

1

수업자료는 어디있나요?

0

374

1

질문 있습니디

0

245

1

multer 사용시 file 외 name값은 못받나용?

0

430

1

코드 중복 부분 질문드립니다.

0

303

1

api 만드는 이유 질문드립니다.

0

293

1

Strategy의 done에 대해 질문드립니다.

0

374

1

안녕하세요 fs 권한 관련 질문드립니다

0

456

1

시퀄라이즈 연결질문...

0

511

2

res.setHeader vs res.cookie

0

1797

3