#mongodb #express #mongoose #jwt #lodash
#mongodb #экспресс #mongoose #jwt #Lodash
Вопрос:
У меня возникли проблемы с получением переменной в базе данных пользователя для обновления с помощью Lodash. Похоже, что она обновляется по одному маршруту (пароль в / resetpassword), но не по другому. (Ссылка для сброса в / forgotpassword)
Мне нужно обновить «resetLink» до нового токена, сгенерированного JWT, чтобы создать ссылку для сброса пароля пользователя.
/ forgotpassword
router.put('/forgotpassword', (req, res) => {
const { email } = req.body;
if (!email) {
return res.status(400).json({ msg: "Please enter all fields" });
} else {
// Find existing User by email address
User.findOne({ email }).then((user) => {
if (!user) return res.status(400).json({ msg: "That email doesn't exist with us..." });
const payload = {
id: user._id,
}
const secret = process.env.JWT_SECRET;
const token = jwt.sign(payload, secret, {
expiresIn: '15m'
});
const obj = {
resetLink: token
}
console.log("obj is " JSON.stringify(obj));
console.log("User is " user);
user = _.extend(user, obj);
user.save((err, result) => {
if (err) {
return res.status(400).json({{ error: "Something went wrong..." err }});
} else {
return res.status(200).json({ msg: "Success! These should match: TOKEN - " token " / RESET LINK - " user.resetLink })
}
})
});
};
});
/resetpassword
router.put('/resetpassword', (req, res) => {
const { resetLink, newPass } = req.body;
if (resetLink) {
jwt.verify(resetLink, process.env.JWT_SECRET, function (err, decodedData) {
if (err) {
return res.status(401).json({ msg: "Incorrect token or it is expired." });
}
User.findOne({ resetLink }, (err, user) => {
if (err || !user) {
return res.status(400).json({ error: "User with this token doesn't exist" });
}
// newPass will be hashed by jwt eventually
const obj = {
password: newPass
}
user = _.extend(user, obj);
user.save((err, result) => {
if (err) {
return res.status(400).json({ error: "Reset password error" });
} else {
return res.status(200).json({ message: "Your password has been changed" });
}
})
})
})
} else {
return res.status(401).json({ error: "Authentication error!" });
}
});
Пользовательская модель Mongoose
const UserSchema = new Schema({
name: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
lowercase: true,
},
password: {
type: String,
required: true,
},
register_date: {
type: Date,
default: Date.now,
},
resetLink: {
data: String,
default: '',
}
});
Как всегда, я ценю любую помощь вообще. Спасибо.
РЕДАКТИРОВАТЬ: вот возвращаемая ошибка —
"error": "Something went wrong...ValidationError: resetLink: Cast to Object failed for value "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVmM2JjN2MwNGVmMmRkNGE2ODkwZDEwYiIsImlhdCI6MTU5Nzc1NDY2MCwiZXhwIjoxNTk3NzU1NTYwfQ.BL8yYsqk2A5hGlNTPa2AxtD_iJ1lWELiCgtpcCkFB6I" at path "resetLink""
Ответ №1:
Моя схема была отключена. Извиняюсь.
resetLink: {
data: String,
default: '',
}
Должно быть:
resetLink: {
Type: String,
default: '',
}