• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Node.js, Express 게시판 선생님 bcrypt false나오는 문제좀 도와주실수있을까요?

선생님 bcrypt false나오는 문제좀 도와주실수있을까요?

3 글 보임 - 1 에서 3 까지 (총 3 중에서)
  • 글쓴이
  • #71813

    정중식
    참가자
    유저가 패스워드를 변경하고 재로그인하면, 패스워드가 일치하지않다고나옵니다.
    환경은 리액트, node.js ,express, mognoDB,mongoose구요
    
    먼저 User스키마쪽에 작성한 코드중 일부입니다. 여기서 비밀번호를 암호화해주고 , compare해줍니다.
    
    UserSchema.pre('save', async function (next) {
      const user = this;
      const hash = await bcrypt.hash(this.password, 10);
      this.password = hash;
      next();
    });
    UserSchema.methods.isValidPassword = async function (password) {
      const user = this;
      const compare = await bcrypt.compare(password, user.password);
      return compare;
    };
    module.exports = mongoose.model('user', UserSchema);
    
    
    그리고 다음은 /edit/profile 라우터 코드입니다. 좀 길어요..ㅠㅠ
    
    
    // 유저 정보 변경
    router.post('/edit/profile', isLogin, async (req, res) => {
      const { nickname, password, avatar, nicknameMode, passwordMode } = req.body;
      try {
        let newUser;
        const user = await User.findById(req.user);
        // 닉네임만 바꾸면,
        if (nicknameMode && !passwordMode) {
          const exist = await User.find({ nickname: nickname });
          if (exist && exist.length !== 0) {
            return res.status(404).json({
              errors: { msg: '이미 존재하는 닉네임입니다.' },
            });
          }
          newUser = await User.findByIdAndUpdate(
            user,
            {
              $set: {
                nickname: nickname ? nickname : user.nickname,
                avatar: avatar ? avatar : user.avatar,
              },
            },
            { new: true }
          )
            .select('-password')
            .exec();
          return res.json(newUser);
        }
        // 패스워드만 바꾸면,
        if (passwordMode && !nicknameMode) {
          console.log(password);
          newUser = await User.findByIdAndUpdate(
            user,
            {
              $set: {
                nickname: nickname ? nickname : user.nickname,
                avatar: avatar ? avatar : user.avatar,
                password: password ? password : user.password,
              },
            },
            { new: true }
          )
            .select('-password')
            .exec();
          await user.save();
          return res.json(newUser);
        }
        // 닉네임, 패스워드 둘다 바꾸게된다면,
        if (passwordMode && nicknameMode) {
          const exist = await User.find({ nickname: nickname });
          if (exist && exist.length !== 0) {
            return res.status(404).json({
              errors: { msg: '이미 존재하는 닉네임입니다.' },
            });
          }
          newUser = await User.findByIdAndUpdate(
            user,
            {
              $set: {
                nickname: nickname ? nickname : user.nickname,
                avatar: avatar ? avatar : user.avatar,
                password: password,
              },
            },
            { new: true }
          )
            .select('-password')
            .exec();
          await user.save();
          return res.json(newUser);
        }
        // 아바타만 변경하게된다면,
        newUser = await User.findByIdAndUpdate(
          user,
          {
            $set: {
              avatar: avatar ? avatar : user.avatar,
            },
          },
          { new: true }
        )
          .select('-password')
          .exec();
        return res.json(newUser);
      } catch (error) {
        console.error(error.message);
        res.status(500).send('Server Error');
      }
    });
     
    코드중에 await user.save();를 써준 이유는 User.js에 작성해놓은 비밀번호 암호화 코드를 작동시키기위해서 입니당..
    
    혹시 이중에 제가 실수한부분이있을까요?
    
    
    
    
    #71814

    정중식
    참가자
        // 패스워드만 바꾸면,
        if (passwordMode && !nicknameMode) {
          const hash = await bcrypt.hash(password, 10);
          newUser = await User.findByIdAndUpdate(
            user,
            {
              $set: {
                nickname: nickname ? nickname : user.nickname,
                avatar: avatar ? avatar : user.avatar,
                password: hash,
              },
            },
            { new: true }
          )
            .select('-password')
            .exec();
          // await user.save();
          return res.json(newUser);
    
    }
    
    await user.save(); 을 없애고 그냥 bcrypt써줘버렸어요.. 이러니까 잘되네요
    제 머리로는 비밀번호 변경할때 
    await user.save(); 하면 당연히 bcrypt될거라고생각했는데 왜 안되는걸까요?
    
    
    
    #71821

    codingapple
    키 마스터
    findByIdAndUpdate는 .save() 안해도 자동으로 문서수정될걸요
3 글 보임 - 1 에서 3 까지 (총 3 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠