如何在mongoose自定义验证器中验证类型

时间:2016-12-17 09:22:31

标签: javascript mongodb validation mongoose mongoose-schema

renderer(_:updateAtTime:)

每当我使用自定义验证器对其进行验证时,它都会转换为“String”,即 结果总是有效的类型。 就像“key”应该只接受“String”一样,如果是“Number”,它应该抛出验证而不是抛出它。

2 个答案:

答案 0 :(得分:0)

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

    var userSchema = new Schema({
  phone: {
    type: String,
    validate: {
      validator: function(v) {
        return /\d{3}-\d{3}-\d{4}/.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!');

你可以拥有自己的正则表达式,以匹配你想要字符串的模式。

答案 1 :(得分:0)

(对于仍然在此问题上绊脚石的人)

您可以为此创建一个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;