• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

post login model.findone() no longer accepts a callback

24.01.05 14:30 작성 조회수 106

3

callback문법이 적용이 안되서 바꿔 성공했는데 좋은 코드인지는 모르겠습니다 참고 하실분은 참고해주세요

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 userdata = await user.generateToken();
    // 토큰을 저장한다. 어디에? 쿠키, 로컬스토리지
    res
      .cookie("x_auth", userdata.token)
      .status(200)
      .json({ loginSuccess: true, userId: userdata._id });
  } catch (err) {
    return res.status(400).send(err);
  }
});

userSchema.methods.comparePassword = function (plainPassword) {
  // plainpassword와 db에 암호화된 비밀번호가 같은지 확인
  const result = bcrypt.compare(plainPassword, this.password);
  return result;
};


userSchema.methods.generateToken = async function (cb) {
  var user = this;
  // jsonwebtoken을 이용해서 token을 생성하기
  var token = jwt.sign(user._id.toHexString(), "secretToken");
  // user._id(db의 _id) + secreToken = token
  // token으로 user를 판별할 수 있다.
  // user.token = token;
  user.token = token;

  try {
    const savedUser = await user.save();
    return user;
  } catch (err) {
    return err;
  }
};

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.05

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

조창욱 님께서 공유하신 코드는 Mongoose 버전 5.0 이상에서 findOne 메소드 사용 시 콜백 함수 대신 프로미스나 async/await 문법을 사용하여 문제를 해결한 좋은 예시입니다. 이와 유사한 질문에 대한 답변이 이미 제공되었으니 참고하시면 도움이 될 것 같습니다.

질문 제목: “model.findone() no longer accepts a callback 오류”
질문 링크로 이동하기

감사합니다.