express-validator自定义validator的custom()

在使用express-validator进行邮箱或用户名验证时,自定义custom()可能会遇到属性读取错误、无效值等问题。custom()的validator函数需返回一个Promise,通过验证时返回任意值,未通过时抛出错误。官方文档示例可能存在误导,mongoose的Model.find()非完整Promise,需手动转换为原生Promise。本文将深入探讨这些问题并提供作者示例及个人实践代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用express-validator进行邮箱(用户名/...)存在性验证时,自定义custom时出了很多问题,遇到的问题有:

  • cannot read property xx
  • invalid value
  • 总是无法通过check,提示错误信息,无论你填的是否正确

点击链接查看express-validator documentation中的详细解释

简单来说custom(validator())的validator函数必须要返回一个Promise.reject(msg)或者throw new Error(msg)

如果通过检查必须返回一个值(随意指定,譬如1,或者返回validator的参数value)

 

validator的实质就是一个原生promise,必须实现resolve和reject. 官方api文档的例子有误,通过检查没返回值,

还有个情况,我用的mongoose的Model.find()它不是full-fledged的promise,

mongoose关于promise接口的解释

文档中说.then()不是full-fledged而exec是full-fledged但经过我测试.exec()依然不可以,我将Model.find()手动改写成

原生promise后成功了

贴一条express-validator作者的示例代码

//./models/users.js
module.exports.findUserByEmail = function(email, callback){

    var request = new mssql.Request(conn);
    console.log("SELECT * FROM u_users WHERE email = '"+email+"'");
    var query = request.query("SELECT * FROM u_users WHERE email = '"+email+"'");

    return query.then(function(results) {
      return results[0];
    }).catch(function(err) {
      console.log("Error verifying email...");
      console.log(err);
      throw err;
    });
}
// ./routes/users.js
req.checkBody('email', 'Email already exists').custom(value => {
    return User.findUserByEmail(value).then(function(user) {
        if (user) {
            throw new Error('this email is already in use');
        }
    })
});

贴一条自己写的代码

check('username').trim().custom(value=>{
                return new Promise((resolve,reject) => {
                    User.findOne({username:value},(err,res) => {
                        if (err) reject(err)
                        if (res) reject('username already exists')
                        resolve('ok')
                    })
                })
        })



check('password2').trim().custom((value,{req})=>{
            if(value!==req.body.password){
                throw new Error('Password does not match')
            } 
            return 1
        })

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值