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

时间:2017-04-06 09:55:45

标签: node.js mongodb validation mongoose schema

背景

我正在为国家/地区定义一个Mongoose架构,我会在其中存储国家/地区名称及其ISO alpha2ISO 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 validatorsvalidator字段是一个函数!

然而

如果我将之前的代码更改为:

"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 个答案:

答案 0 :(得分:1)

这是因为validator函数只需要一个参数。

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

  

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

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

您首先代码失败主要是因为Mongoose将其视为异步验证,但情况并非如此。作为一条黄金法则,验证功能应该是内联的。

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

谢谢,