Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose:简单自定义验证功能不工作 背景_Node.js_Mongodb_Validation_Mongoose_Schema - Fatal编程技术网

Node.js Mongoose:简单自定义验证功能不工作 背景

Node.js Mongoose:简单自定义验证功能不工作 背景,node.js,mongodb,validation,mongoose,schema,Node.js,Mongodb,Validation,Mongoose,Schema,我正在为国家定义一个猫鼬模式,在这里我存储国家名称及其名称和代码 这些ISO代码只是国家名称的缩写。例如,西班牙是西班牙,美国是美国,等等 客观的 我的目标是进行模式验证,以便在集合中插入国家时,代码具有适当数量的字母 ISO alpha2代码只能有2个字符,而ISO alpha3代码可以有3个字符 问题 为了实现这一点,我有一个验证函数,用于检查给定代码的大小是否正确: const hasValidFormat = (val, size) => val.length === size;

我正在为国家定义一个猫鼬模式,在这里我存储国家名称及其名称和代码

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

客观的 我的目标是进行模式验证,以便在集合中插入国家时,代码具有适当数量的字母

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未定义
,代码无法运行。这令人困惑,因为根据,验证程序字段是一个函数

然而 如果我将以前的代码更改为:

"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;
它会成功的

问题:
有人能解释一下为什么第一个示例不起作用,而第二个却起作用吗?

这是因为
验证器
函数只接受一个参数

根据文档,如果
validator
函数接受两个参数,mongoose将假定第二个参数是回调


“自定义验证器也可以是异步的。如果您的验证器 函数接受2个参数,mongoose将假定第2个参数是 回拨。”

资料来源:

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

您可以使用closer函数来实现所需的行为,如第二个代码示例中所示


谢谢,

如果这不是JavaScript,您所说的将是有意义的。如果您传递了额外的参数,并且函数不需要这些参数,它将忽略这些参数。但是如果你这么肯定,你能提供一个文档链接到你的解释吗?自定义验证器也可以是异步的。如果您的验证器函数有两个参数,mongoose将假定第二个参数是回调。“请在给定的链接上找到上面一行。我理解。你发现了一些我没有的东西。我会修正你答案中的英语语法问题,投票并接受。完成。我希望你喜欢D