代码之家  ›  专栏  ›  技术社区  ›  Azoulay Jason

Mongoose中使用错误验证器的路由

  •  1
  • Azoulay Jason  · 技术社区  · 9 年前

    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()时都会运行此函数?

    2 回复  |  直到 9 年前
        1
  •  1
  •   user8377060 user8377060    9 年前

    下面是问题所在,你提供 bio , location , gender birthday 但不是密码。当您不声明密码时 length 将等于 0 5 40

    else{
                                        user.password=req.body.password;
                                        //I added user.password here, this is what you should do
                                        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 !"});
                                            }
                                        }); 
                                    }
    

    在此处更新

    生物 , 地方 , 性别 生日 然后使用 save() findOneAndUpdate()

    User.findOneAndUpdate({_id:req.decoded.userId}, { $rename : {gender: 'male' , bio : 'somethingElse'}}, {new: true}, function(err, user){
    if(err) throw err;
    else{
    console.log("done : " + user.gender);
    }
    });
    

    findOneAndUpdate 和 its operators to be used

        2
  •  0
  •   Azoulay Jason    9 年前

    我在Mongoose doc中找到了另一个解决方案。

    User.findByIdAndUpdate(req.decoded.userId,{$set:{bio:req.body.bio, location:req.body.location, gender:req.body.gender, birthday:req.body.birthday}},{new:true},function(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{
                                        res.json({success:true,user:user});
                                    }
                                }
                            });