我如何验证猫鼬自定义验证器中的类型

Posted

技术标签:

【中文标题】我如何验证猫鼬自定义验证器中的类型【英文标题】:How can i validate type in mongoose custom validator 【发布时间】:2017-05-03 00:03:16 【问题描述】:
key: 
    type: 'String',
    required: [true, 'Required'],
    trim: true

每当我使用自定义验证器对其进行验证时,它都会转换为“字符串”,即 导致始终有效的类型。 像“key”应该只接受“String”,如果“Number”应该抛出验证而不是强制转换。

【问题讨论】:

【参考方案1】:

(对于那些还在纠结这个问题的人)

您可以为此创建一个custom schema type,它不允许强制转换。然后你可以在你的架构中使用它而不是字符串(例如type: NoCastString)。

function NoCastString(key, options) 
  mongoose.SchemaType.call(this, key, options, "NoCastString");

NoCastString.prototype = Object.create(mongoose.SchemaType.prototype);

NoCastString.prototype.cast = function(str) 
  if (typeof str !== "string") 
    throw new Error(`NoCastString: $str is not a string`);
  
  return str;
;

mongoose.Schema.Types.NoCastString = NoCastString;

【讨论】:

【参考方案2】:

您可以将验证函数传递给猫鼬模式的验证器对象。 请参阅下面具有自定义验证功能以验证电话号码架构的示例架构。

    var userSchema = new Schema(
  phone: 
    type: String,
    validate: 
      validator: function(v) 
        return /\d3-\d3-\d4/.test(v);
      ,
      message: 'VALUE is not a valid phone number!'
    ,
    required: [true, 'User phone number required']
  
);

这个验证可以通过断言来测试

    var User = db.model('user', userSchema);
var user = new User();
var error;

user.phone = '555.0123';
error = user.validateSync();
assert.equal(error.errors['phone'].message,
  '555.0123 is not a valid phone number!');

你可以有自己的正则表达式来匹配你想要的字符串应该是什么模式。

【讨论】:

以上是关于我如何验证猫鼬自定义验证器中的类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬模式验证器中获取猫鼬会话

如何验证猫鼬模式的动态密钥

护照本地猫鼬中的密码验证器选项不起作用

如何使用猫鼬需要验证在猫鼬中插入多个文档?

通过回调或猫鼬模型验证 PassportJS?

如何修复“需要路径,验证错误”,猫鼬,节点