我正在嘗試在 Node.JS 中創建用于重置用戶密碼的控制器。這個想法是根據重置密碼令牌從資料庫中獲取用戶,對相關欄位進行一些驗證更新并將其保存回資料庫。但是,在嘗試保存更新的用戶時出現錯誤(“user.save 不是函式”)。可能是什么原因?
我有一個用戶模型定義如下:
const mongoose = require("mongoose");
const validator = require("validator");
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const crypto = require("crypto");
const userSchema = new mongoose.Schema({
name: {
type: String,
required: [true, "Please enter valid name"],
maxLength: [30, "Your name cannot exceed 30 characters]"],
},
email: {
type: String,
required: [true, "Please enter valid email"],
unique: true,
validate: [validator.isEmail, "Please enter valid email address"],
},
password: {
type: String,
requires: [true, "Please enter your password"],
minLength: [6, "Your password must be at least 6 characters"],
select: false,
},
avatar: {
public_id: { type: String, required: true },
url: { type: String, required: true },
},
role: { type: String, default: "user" },
createdAt: { type: Date, default: new Date().now },
resetPasswordToken: { type: String },
resetPasswordExpire: { type: Date },
});
userSchema.pre("save", async function (next) {
if (!this.isModified("password")) {
next();
}
this.password = await bcrypt.hash(this.password, 10);
});
// check password matching
userSchema.methods.isPasswordMatched = async function (inputPassword) {
return await bcrypt.compare(inputPassword, this.password);
};
// return JSON Web Token
userSchema.methods.getJwtToken = function () {
return jwt.sign({ id: this.id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRESIN_TIME,
});
};
// Generate password token
userSchema.methods.getResetPasswordToken = function () {
// Generate Token
const resetToken = crypto.randomBytes(20).toString("hex");
// Hash token
this.resetPasswordToken = crypto
.createHash("sha256")
.update(resetToken)
.digest("hex");
// set expired time
this.resetPasswordExpire = new Date(Date.now() 30 * 60 * 1000);
return resetToken;
};
module.exports = mongoose.model("User", userSchema);
當我嘗試重置用戶密碼時,我嘗試以下操作:
// get the user document from db (make sure token and expiration time are valid)
let user = User.findOne({
resetPasswordToken: resetPasswordToken,
resetPasswordExpire: { $gt: Date.now() },
});
// update password
user.password = req.body.password;
user.resetPasswordToken = undefined;
user.resetPasswordExpire = undefined;
user.save();
sendToken(user, 200, res);
出于某種原因,我收到一個錯誤:“errorMsg”:“user.save 不是函式”
可能是什么問題?
uj5u.com熱心網友回復:
使用 await 關鍵字讓貓鼬保濕回應
let user = await User.findOne({
resetPasswordToken: resetPasswordToken,
resetPasswordExpire: { $gt: Date.now() },
});
// update password
user.password = req.body.password;
user.resetPasswordToken = undefined;
user.resetPasswordExpire = undefined;
user.save();
sendToken(user, 200, res);
或者你可以這樣做
await User.findOneAndUpdate({
resetPasswordToken: resetPasswordToken,
resetPasswordExpire: { $gt: Date.now() },
},{password : req.body.password, resetPasswordToken : undefined,
resetPasswordExpire : undefined,});
uj5u.com熱心網友回復:
可能用戶為空或未定義,因此您應該處理用戶為空的情況。findOne 和 save 也回傳 promise,所以你需要await在它們之前添加關鍵字。
此外,您在用戶架構密碼欄位中有一個錯字,requires應該是required.
let user = await User.findOne({
resetPasswordToken: resetPasswordToken,
resetPasswordExpire: { $gt: Date.now() },
});
if (user) {
// update password
user.password = req.body.password;
user.resetPasswordToken = undefined;
user.resetPasswordExpire = undefined;
await user.save();
sendToken(user, 200, res);
} else {
res.status(400).send("No user found");
}
如果您讓用戶為空,則需要在 findOne 中修復您的查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/340245.html
上一篇:MongoDB-在對一組檔案中另一個特征的最大值進行切片后的特征平均值
下一篇:優化MongoDB中的索引
