문제
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;
};
'오늘의뻘짓' 카테고리의 다른 글
리액트 설치시 오류 “npm install” 오류 발생할때 :- npm i npm ERR! code EEXIST npm ERR! syscall rename (0) | 2024.03.16 |
---|---|
맥 OS 새 터미널 안열리는 오류 (0) | 2023.12.28 |
[따라하며 배우는 노드js] 13강 오류 (2) | 2023.11.24 |
[따라하며 배우는 노드js] 7강 오류 (1) | 2023.11.22 |
0722 장고 홈페이지 설정오류 (프로그래머스 [Day14] Web Application with Django) (0) | 2022.07.22 |