Mongoose:简单的自定义验证功能不起作用

Posted

技术标签:

【中文标题】Mongoose:简单的自定义验证功能不起作用【英文标题】:Mongoose: Simple custom validation function not working 【发布时间】:2017-09-01 06:43:25 【问题描述】:

背景

我正在为国家/地区定义 Mongoose 模式,我在其中存储国家/地区名称及其 ISO alpha2 和 ISO alpha3 代码。

这些 ISO 代码只是国家名称的缩写。例如,西班牙是 ES,美国是美国,等等。

目标

我的目标是进行模式验证,以便在集合中插入国家/地区时代码具有正确数量的字母。

一个 ISO alpha2 代码只能有 2 个字符,而一个 ISO alpha3 代码可以有 3 个字符。

问题

为了实现这一点,我有一个验证函数来检查给定代码的大小是否正确:

const hasValidFormat = (val, size) => val.length === size;  

我正在尝试将此函数用作我的验证器:

"use strict";

const mongoose = require("mongoose");

const hasValidFormat = (val, size) => val.length === size; 

const countrySchema = 
    name:  type: String, required: true ,
    isoCodes:
        alpha2:  
            type: String, 
            required:true,
            validate: 
                validator: hasValidFormat(val, 2),
                message: "Incorrect format for alpha-2 type ISO code."
            
        ,
        alpha3:  
            type: String,
             validate: 
                validator: hasValidFormat(val, 3),
                message: "Incorrect format for alpha-3 type ISO code."
                       
        
    
;


module.exports = new mongoose.Schema(countrySchema);
module.exports.countrySchema = countrySchema;

问题是我有错误val is not defined 并且代码无法运行。这很混乱,因为根据Mongoose docs for custom validators,validator 字段是一个函数!

然而

如果我把之前的代码改成:

"use strict";

const mongoose = require("mongoose");

const hasValidFormat = (val, size) => val.length === size; 

const countrySchema = 
    name:  type: String, required: true ,
    isoCodes:
        alpha2:  
            type: String, 
            required:true,
            validate: 
                validator: val => hasValidFormat(val, 2),
                message: "Incorrect format for alpha-2 type ISO code."
            
        ,
        alpha3:  
            type: String,
             validate: 
                validator: val => hasValidFormat(val, 3),
                message: "Incorrect format for alpha-3 type ISO code."
                       
        
    
;


module.exports = new mongoose.Schema(countrySchema);
module.exports.countrySchema = countrySchema;

它会起作用的!

问题

谁能解释一下为什么第一个例子不起作用,而第二个例子起作用?

【问题讨论】:

【参考方案1】:

这是因为validator 函数只接受一个参数。

根据文档,如果validator 函数有两个参数,猫鼬会假设第二个参数是回调。

"自定义验证器也可以是异步的。如果您的验证器 函数有 2 个参数,猫鼬会假设第二个参数是 回调。”

来源:http://mongoosejs.com/docs/validation.html

您的第一个代码失败主要是因为 Mongoose 将其视为异步验证,但事实并非如此。作为黄金法则,验证函数应该是内联的。

您可以使用更接近的函数来实现您正在寻找的行为,就像在第二个代码示例中一样。

谢谢,

【讨论】:

如果这不是 javascript,您所说的将是有道理的。如果您传递额外的参数并且函数不期望它们,它将忽略它们。但是,如果您如此确定,您能否提供解释的文档链接?很想读一读。 "自定义验证器也可以是异步的。如果您的验证器函数接受 2 个参数,猫鼬将假定第二个参数是回调。"请在给定链接上找到上述行。 我明白了。你找到了我没有找到的东西。我会解决您在回答中遇到的英语语法问题,点赞并接受。 完成。我希望你喜欢 ! :D

以上是关于Mongoose:简单的自定义验证功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的自定义验证器在 parsley.js 中不起作用?

Mongoose 所需的真实验证不起作用

mongoose 5.7.0 中的自定义验证

为啥我的自定义 ButtonRenderer 不起作用?

材料ui的自定义输入中的Redux表单不起作用

为啥我的自定义 iPhone 委托不起作用?