使用mongoose+express+validator时如何在存库前校验密码与确认密码一致
可行实现方法
方法1:在Mongoose Schema层添加校验(推荐)
这种方式将校验逻辑和数据模型绑定,后续维护更方便,直接修改你的accountSchema即可:
在确认密码cfpassword的配置项中新增自定义校验规则,示例代码如下:
const accountSchema = new mongoose.Schema( { fname: { type: String, required: true, }, lname: { type: String, required: true, }, email: { type: String, required: true, index: { unique: true }, validate: [validator.isEmail, 'invalid email'], }, password: { type: String, required: true, minlength: 8 }, cfpassword: { type: String, required: true, minlength: 8, // 新增自定义校验规则 validate: { validator: function(val) { // 这里的this指向当前新建的文档实例,val是cfpassword的输入值 return val === this.password }, message: '两次输入的密码不一致' } } } )
校验不通过时,save方法返回的错误信息中会携带上面定义的提示内容,你可以在post接口的错误处理分支把错误信息返回给前端,给用户做提示。
方法2:在路由层提前校验(更简单,适合入门理解)
不需要修改Schema代码,直接在注册接口的业务逻辑最前面加判断,密码不一致直接返回错误,不执行后续存库逻辑:
app.post('/', (req, res) => { // 新增密码一致性校验 if(req.body.password !== req.body.cfpassword) { return res.status(400).send('两次输入的密码不一致') } const NewAccount = new Account(req.body) NewAccount.save((err) => { if (err) { console.log(err) // 也可在这里统一处理其他校验错误,比如邮箱格式错误、密码长度不足等 res.status(400).send('注册失败:' + err.message) } else { res.send("注册成功") console.log("Inserted successfully") } }) })
额外注意
生产环境不要直接存储明文密码,建议使用bcrypt等加密库对密码做哈希处理后再存入数据库,避免数据泄露导致用户账号安全受影响。
内容的提问来源于stack exchange,提问作者Jamie Nguyen
相关产品推荐
相关产品推荐

