【问题标题】:express-validator with mongoose带有猫鼬的快速验证器
【发布时间】:2017-09-24 00:13:16
【问题描述】:

我正在开发自己的网站,使用 (angularjs, bootstrap) 作为数据库的前端 (node, express) 作为后端 (mongodb, mongoose 层)。
我有一个注册表单,在该表单中,我想在有人尝试创建新帐户时检查该电子邮件是否尚未被使用,因此我希望我的注册 api 检查提交的电子邮件是否之前尚未被使用。

我现在正在使用这个验证器 https://github.com/ctavan/express-validator#validation-by-schema 这是我的代码:

var vadlidateRegUser= function (req,res,next) {
req.checkQuery('UserName','Username must contain letters and numbers only').isAlphanumeric().notEmpty();

req.checkQuery('Email','Email should have a valid syntax e.g: example@example.com')
    .isEmail().notEmpty();

var error = req.validationErrors();
if(!error){
next();
}else {
  res.json({success:false, message:error});
}

}

现在我想通过验证器检查电子邮件是否唯一,如下所示:

req.checkQuery('Email','Email should have a valid syntax e.g: example@example.com')
    .isEmail().isUnique(Model Name);

有什么建议吗?

【问题讨论】:

  • 您的问题/疑问是什么?
  • 抱歉更新了。
  • isEmail 不检查它是否是有效的电子邮件......我无法得到你?
  • 不,它只是检查语法,我希望它检查数据库。

标签: node.js mongodb express mongoose


【解决方案1】:

我知道这个问题很老,但我今天发现它希望能帮助我解决同样的问题,但我设法找到了解决方法,所以我想分享它以供下一个找到它。

现在 express-validator 可以使用 Promises 进行检查。

我所做的是用我的猫鼬模式创建一个单独的文件,并在我的路由器中要求它,然后在我检查期间我这样做了:

check('email').custom((value) => {

    var query = User.find({ email: value})
    return query.exec().then(user => {
        if (user.length > 0) {
             return Promise.reject('E-mail already in use');
        }
    });
}),

一切都像魅力一样!

我希望这对其他人有所帮助。 如果您需要更多细节,请回复,以便我添加更多细节。

【讨论】:

    【解决方案2】:

    express-validator 可以检查和清理您的输入数据,但无法判断电子邮件是否已在您的数据库中。

    我认为最好的方法是在您的 mongoose 架构中设置unique,并在电子邮件已经存在时处理错误。:

    let User = new Schema({
        firstname: String,
        lastname: String,
        email: {
            type: String,
            required: true,
            unique: true,  // ensure unique email
            validate: [ isEmail, "Email should have a valid syntax e.g: example@example.com" ]
        },
        // ...
    })
    

    【讨论】:

    • 非常感谢,但这是最佳做法吗?!如果我制定了我的自定义规则呢?!
    • 不客气。我认为这是一个简单而干净的解决方案,但我很高兴听到其他专家的意见。如果你真的想用 express-validation 来做这个,你可以创建自己的customValidators,但我认为这不太有效,因为你必须进行数据库查询来检查电子邮件是否已经存在。
    • 感谢您的帮助,我会听取您的建议,我将使用 mongoose 验证器来实现。
    • 如果其他人偶然发现了这个解决方案,read this first。 mongoose unique 可能不会像你想象的那样做。
    • 我认为两个用户不太可能会尝试在完全相同的时间使用同一电子邮件注册@JamesLemieux。在这个解决方案中,我没有使用 unique 作为验证器,而是作为唯一索引。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2015-01-19
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多