user.save((err)=>{})
说密码太长。它使用
passwordValidator
我创建了,但我显然也没有在模式中为这个路由调用它。
mongoose中的用户模式:
const userSchema=new Schema({
email: { type: String, required: true, unique: true, lowercase: true, validate: emailValidators},
username: { type: String, required: true, unique: true, lowercase: true, validate: usernameValidators},
bio: { type:String,default:null,validate:bioValidators},
location: {type:String, default:null},
gender: {type:String,default:null,validate:genderValidators},
birthday: { type:String,default:null},
password: { type: String, required: true,validate: passwordValidators}
});
路线:
router.put('/editProfile',(req,res)=>{
if(!req.body.bio){
res.json({success:false,message:"No bio provided"});
}
else{
if(!req.body.location){
res.json({success:false,message:"No location provided"});
}
else{
if(!req.body.gender){
res.json({success:false,message:"No gender provided"});
}
else{
if (!req.body.birthday) {
res.json({success:false,message:"No birthday provided"});
}
else{
User.findOne({_id:req.decoded.userId},(err,user)=>{
if(err){
res.json({success:false,message:"Something went wrong: "+err});
}
else{
if(!user){
res.json({success:false,message:"User not found"});
}
else{
user.bio=req.body.bio;
user.location=req.body.location;
user.gender=req.body.gender;
user.birthday=req.body.birthday;
user.save((err)=>{
if(err){
res.json({success:false,message:'Something went wrong: '+ err}); //returns this
}
else{
res.json({success:true,message:"Account updated !"});
}
});
}
}
});
}
}
}
}
});
这是密码验证器阵列
const passwordValidators = [
{
validator: passwordLengthChecker,
message: 'Password must be at least 5 characters but no more than 40'
},
{
validator:validPassword,
message: 'Must have at least one uppercase, lowercase, special character, and number'
}
];
let passwordLengthChecker = (password)=>{
if (!password) {
return false;
}
else{
if(password.length<5 || password.length>40){
return false;
}
else{
return true;
}
}
};
let validPassword = (password)=>{
if (!password) {
return false;
}
else{
const regExp = new RegExp(/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[\d])(?=.*?[\W]).{8,35}$/);
return regExp.test(password);
}
};
正如你所看到的,它正在使用passwordLengthChecker,尽管它不应该这样做
userSchema.pre('save', function(next){
if(!this.isModified('password'))
return next();
bcrypt.hash(this.password, null, null, (err,hash)=>{
if(err) return next(err);
this.password=hash;
next();
});
});
这是否意味着每次使用save()时都会运行此函数?