Mongoose:保存时未执行验证

Posted

技术标签:

【中文标题】Mongoose:保存时未执行验证【英文标题】:Mongoose: Validation not being executed when saving 【发布时间】:2016-11-17 04:14:29 【问题描述】:

我已经定义了这个 Mongoose 架构:

// validator function
var arrayWithAtLeastFiveElements = function (a) 
    return (a !== undefined && a.length >= 5);
;

var orderSchema = new Schema(
    user: 
        type: Schema.ObjectId,
        ref: User,
        required: true
    ,
    products: [
        type: Schema.ObjectId,
        ref: Product,
        required: true,
        validate: [arrayWithAtLeastFiveElements, 'Order needs to have at least five products']
    ]
, 
    timestamps: 
        createdAt: 'created_at',
        updatedAt: 'updated_at'
    
);

当我尝试保存它时,如果productsundefinednull 或一个空数组,则不会执行验证,它会在每种情况下用一个空的产品数组保存新订单。验证仅在 products 是一个包含至少一个元素的数组时运行。有什么线索吗?有没有办法让验证在所有情况下都运行?另外,在这种情况下需要做什么?如果我根据需要定义 products 数组,我看不到验证有任何变化......

【问题讨论】:

根据我的经验,不要依赖猫鼬验证。 尝试将其定义为products: type: [Schema.ObjectId], required: true。无论如何, undefined 仅使用所需的验证器进行验证。您还可以编写自己的验证器来验证数组长度并像minlength: 5 一样使用它。这个验证器仍然不会覆盖 undefined。 @Amiram Korach:谢谢!有用!但是,怎么会?现在我已经涵盖了所有内容,如果数组为空、null 或未定义需要验证它,在其他情况下我的自定义验证器运行。 我只是写了我一直这样做的方式。不知道你写的好不好。 好的。顺便说一句,我认为 minlength 验证仅适用于字符串 【参考方案1】:

定义它:

products: 
   type: [Schema.ObjectId],
   required: true,

【讨论】:

以上是关于Mongoose:保存时未执行验证的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose VersionError:保存文档时未找到与 id 匹配的文档

Mongoose ODM,保存前更改变量

Mongoose ODM,保存前更改变量

针对 Mongoose 模式验证对象而不保存为新文档

从 mongoose 数据库获取值时未定义

Mongoose 所需的真实验证不起作用