작성
·
737
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);
}
};
답변 1
0
salt를 왜 넣으시는거죠? 누구 코드를 보고 하시고 계신건가요? 제 강좌 코드를 따라하세요. 저도 제 코드가 아닌 부분은 모릅니다.
async await 에러는 try catch로 해결하시면 됩니다.