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

rudqq님의 프로필 이미지
rudqq

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의

12강 데이터베이스에 있는 정보로 로그인 부분 오류가 계속 납니다

작성

·

422

·

수정됨

0

안녕하세요 선생님 12강 데이터베이스에 있는 정보로 로그인 하는 쪽 강의 질문 드립니다.

app.post("/api/users/login", (req, res) => {
  // 요청된 이메일을 데이터베이스에서 찾는다
  User.findOne({ email: req.body.email }, (err, user) => {
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: "제공된 이메일에 해당하는 유저가 없습니다",
      });
    }

    // 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는 비밀번호 인지 확인
    user.comparePassword(req.body.password, (err, isMatch) => {
      // 비밀번호가 틀릴 경우
      if (!isMatch)
        return res.json({
          loginSuccess: false,
          message: "비밀번호가 틀렸습니다",
        });

      // 비밀번호까지 맞다면 토큰을 생성하기
      user.generateToken((err, user) => {
        if (err) return res.status(400).send(err);

        // 토큰을 저장한다. 쿠키 로컬스토리지 세션 등
        // 여기서는 쿠키 사용

        // x_auth라는 이름으로 토큰이 들어감
        res
          .cookie("x_auth", user.token)
          .status(200)
          .json({ loginSuccess: true, userId: user._id });
      });
    });
  });
});

위와 같이 작성된 코드를

app.post("/api/users/login", async (req, res) => {
  // 요청된 이메일을 데이터베이스에서 찾는다
  try {
    const user = await User.findOne({ email: req.body.email });
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: "제공된 이메일에 해당하는 유저가 없습니다",
      });
    }

    // 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는 비밀번호 인지 확인

    const isMatch = await user.comparePassword(req.body.password);
    // 비밀번호가 틀릴 경우
    if (!isMatch) {
      return res.json({
        loginSuccess: false,
        message: "비밀번호가 틀렸습니다",
      });
    }

    // 비밀번호까지 맞다면 토큰을 생성하기
    const token = await user.generateToken();

    // 토큰을 저장한다. 쿠키 로컬스토리지 세션 등
    // 여기서는 쿠키 사용

    // x_auth라는 이름으로 토큰이 들어감
    res
      .cookie("x_auth", token)
      .status(200)
      .json({ loginSuccess: true, userId: user._id });
  } catch (err) {
    return res.status(400).json({ loginSuccess: false, error: err });
  }
});


이렇게 변경했습니다. 그런데 postman으로 자꾸 실행해보면 비밀번호가 틀렸다는 오류를 받고 있습니다. 그리고 서버가 꺼지는 현상이 발생하고 있습니다. isMatch문이 잘못된 것 같아서 !isMatch 예외문을 주석처리하고 실행하면 서버가 바로 꺼져버리는 현상이 발생합니다. 어떻게 코드를 변경해야 할까요?

그리고 console.log()로 오는 값들을 확인하고 싶은데 cossole.log()로 찍은 보고싶은 값을 어떻게 볼 수 있나요? http://localhost:5000/api/users/login 로 들어갔는데도 안보입니당..

%% 이 코드를 /register로 postman을 보낼때는 정상적으로 작동하고 monogdb에도 잘 등록이 되서 다른 부분은 오류가 아닌 것 같습니다 %%

%% 스키마 부분 코드도 첨부합니다 (선새인ㅁ과 똑같이 작성함) %%

userSchema.methods.comparePassword = function (plainPassword, cb) {
  // plainPassword 는 입력한 값 데이터베이스 비밀번호는 $2b$10 등 으로 암호화 되어 있음
  // 그러므로 plainPassword를 암호호 해야 함
  // bcrypt를 이용해 암호화
  bcrypt.compare(plainPassword, this.password, function (err, isMatch) {
    // this.password는 5번째줄에 userSchema에서 가져옴
    if (err) return cb(err);
    cb(null, isMatch);
  });
};

userSchema.methods.generateToken = function (cb) {
  let user = this;
  // 데이터베이스의 id 를 넣고 이름을 정해준다.
  // 이후 secretToken을 입력하면 user._id가 나온다
  let token = jwt.sign(user._id.toHexString(), "secretToken");

  // user의 token에 방금 만든 token을 넣어준다.
  user.token = token;
  user.save(function (err, user) {
    if (err) return cb(err);
    cb(null, user);
  });
};


답변 2

0

안녕하세요.

혹시 비밀번호 오류 문제 해결 하셨나요?...ㅠ

아녀.. 제가 중간에 취업을 해서 이 이후로 코드를 못건드렸네요 ㅠㅠ 다음주에 자격증 시험이 끝나고 한번 연습해 보려 하는데 해결하면 답장 드리겠습니다

0

안녕하세요, 인프런 AI 인턴입니다.

로그인 부분에서 오류가 발생하는 것으로 이해하겠습니다.

일단 코드 변경 부분은 올바르게 작성하신 것 같습니다.

오류 코드를 보면 비밀번호가 틀렸다는 메시지가 출력된다고 하셨는데요,

해당 메시지가 출력되는 시나리오는 다음과 같은데요.

  1. 사용자 이메일 정보를 찾았을 때, 해당 이메일로 가입된 사용자 정보가 없으면 로그인 실패를 반환하는 부분

  2. 사용자 정보가 있을 때, 비밀번호가 다른 경우 로그인 실패를 반환하는 부분

이에 따라서 해당 코드에서 비밀번호가 맞지 않을 때, 로그인 실패 메시지를 반환하는 부분도 올바르게 작동하고 있는 것 같습니다.

그렇다면 이것보다 더 구체적인 오류 메시지가 필요할 것 같습니다.

그리고 서버가 꺼지는 현상이 발생한다고 하셨는데요,

로그인 부분과 연관된 부분인지 확인해보아야 할 것 같습니다.

console.log()로 오는 값들을 확인하고 싶다고 말씀하셨는데요,

해당 값들은 서버 콘솔창에서 확인하실 수 있습니다.

http://localhost:5000/api/users/login로 들어가면 됩니다.

또한, 해당 부분에서 이미 쿠키를 설정하고 반환하고 있으니, postman으로 확인할 때도 쿠키 설정을 해주셔야 합니다.

서버가 바로 꺼지는 현상이 발생한다고 하셨는데, 정확한 원인 파악이 가능한 부분이 아니라면 코드 분석이 필요할 것 같습니다.

상세한 코드 분석이 필요하다면 로그를 활용하여 추적하는 것이 좋을 것 같습니다.

감사합니다.

rudqq님의 프로필 이미지
rudqq

작성한 질문수

질문하기