【问题标题】:Mongoose does not throw error when validate in schema matches false当模式中的验证匹配 false 时,Mongoose 不会抛出错误
【发布时间】:2020-04-18 12:12:51
【问题描述】:

我为我的应用程序中最常见的场景创建了自定义通用验证函数,例如电子邮件验证、电话号码验证和日期/时间验证。

时间验证(HH:MM 格式):

    validateTime: (time) => {
        return [new RegExp(HHMM_TIME_FORMAT).test(time), 'Wrong time format. Expected hh:mm']
    }

在模型中的使用:

...
        visitHourStart: {
            type: String,
            validate: modelValidator.validateTime
        }
...

给定VisitHourStart 值:x08:30xvalidateTime 返回 false - 这是一种很好的行为,但它不会在给定消息时抛出错误。文档正在以错误的时间保存到数据库。

如何告诉我的模型在验证失败时抛出错误?

EDIT1:validate: modelValidator.validateTime 更改为

validate: {
    validator: time => new RegExp(HHMM_TIME_FORMAT).test(time),
    message: 'Wrong time format. Expected hh:mm'
}

内部架构不起作用,仍然没有抛出错误并保存文档。

【问题讨论】:

    标签: javascript node.js mongodb validation mongoose


    【解决方案1】:

    validate 参数需要一个代表Custom Validator 的对象,如下所示:

    visitHourStart: {
        type: String,
        validate: {
            validator: time => new RegExp(HHMM_TIME_FORMAT).test(time),
            message: 'Wrong time format. Expected hh:mm'
        }
    }
    

    你也可以直接指定RegExp类型而不是箭头函数:

    visitHourStart: {
        type: String,
        validate: {
            validator: new RegExp(HHMM_TIME_FORMAT),
            message: 'Wrong time format. Expected hh:mm'
        }
    }
    

    编辑:在您的示例中,您传递了一个箭头函数,该函数返回一个数组,而 Mongoose 期望直接指定一个数组,如下所示:

    validate: [
        new RegExp(HHMM_TIME_FORMAT),
        'Wrong time format. Expected hh:mm'
    ]
    

    以上三种方式我都测试过了,每次都报错

    【讨论】:

    • 不幸的是,仍然没有抛出错误并且记录被添加到数据库中
    • @mickl 我也有同样的想法,但可以像 OP 发布的那样定义验证器。 Here
    • @ambianBeing 感谢您的评论。问题是这种语法与 OP 使用的语法有点不同
    • @janlan 您能否也展示一下您是如何保存文档的?我尝试了简单的.save() 并且我的答案中描述的所有方式都引发了错误
    • @ambianBeing arrayfunction returning an array 之间存在差异。我猜猫鼬不期望任何功能,因此框架没有调用该功能,因此他的验证器没有被应用。现在它可以工作了:)
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2019-12-13
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多