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

标签 node.js mongodb validation mongoose schema

背景

我正在为国家/地区定义一个 Mongoose 架构,我在其中存储国家/地区名称及其 ISO alpha2ISO alpha3代码。

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

目标

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

一个 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;

它会起作用的!

问题

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

最佳答案

这是因为validator 函数将只有一个参数。

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

"Custom validators can also be asynchronous. If your validator function takes 2 arguments, mongoose will assume the 2nd argument is a callback."

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

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

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

谢谢,

关于node.js - Mongoose :简单的自定义验证功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43251725/

相关文章:

node.js - statsd 的 Upstart 工作问题

node.js - node.js 在 Linux 上要求文件名区分大小写吗?

javascript - 来自 ReactJs 的 POST 请求

c# - 在WPF中实现InotifyDataErrorInfo

JavaScript 电话号码验证(拒绝带有字母字符的输入)

javascript - Node JS mysql 从数据库中删除多个条件

java - 使用 UTC 时区解析 ISO8601 日期字符串到日期

mongodb - mongodb可以作为嵌入式数据库使用吗?

mongodb - 使用 MongoDB Java 驱动程序以编程方式设置分片键

java - 纯Java验证框架