본문 바로가기
오늘의뻘짓

[따라하며 배우는 노드js] 12강 오류

by 강갱민 2023. 11. 24.


문제 
    throw new MongooseError('Model.prototype.save() no longer accepts a callback');
          ^

MongooseError: Model.prototype.save() no longer accepts a callback

 

문제원인

문제의 원인은 여전히 userSchema.methods.generateToken 메서드에서 발생합니다. 이 메서드에서 user.save() 메서드를 콜백과 함께 사용하고 있기 때문입니다. 최신 버전의 Mongoose에서는 save() 메서드가 콜백을 지원하지 않으므로, 이를 async/await 패턴으로 수정해야 합니다.

 

해결

기존에 강의 코드는 save 를 활용하는데 이게 mongoose 최근버전부터는 비동기로 조져야한다고 한다. 

그래서 다음과 같이 코드를 수정해주었더니 문제를 해결할 수 있었다.

index.js

app.post('/register', async (req, res) => {
  const user = new User(req.body);

  try {
    const doc = await user.save();
    res.status(200).json({ success: true });
  } catch (err) {
    console.log(err); // 오류 로깅

    res.json({ success: false, err });
  }
});app.post('/login', async (req, res) => {
  try {
      const user = await User.findOne({ email: req.body.email });
      if (!user) {
          return res.json({
              loginSuccess: false,
              message: "제공된 이메일에 해당하는 유저가 없습니다."
          });
      }

      user.comparePassword(req.body.password, async (err, isMatch) => {
          if (err) return res.status(400).send(err);
          if (!isMatch) {
              return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." });
          }

          try {
              const tokenUser = await user.generateToken();
              res.cookie("x_auth", tokenUser.token)
                 .status(200)
                 .json({ loginSuccess: true, userId: user._id });
          } catch (error) {
              res.status(400).send(error);
          }
      });
  } catch (error) {
      res.status(500).json({ success: false, error });
  }
});

user.js

userSchema.methods.generateToken = async function() {
    var user = this;
    var token = jwt.sign(user._id.toHexString(), 'secretToken');
    user.token = token;
    await user.save();
    return user;
};