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