Mongoose 模型中的自定义实例或静态方法中的验证错误

Posted

技术标签:

【中文标题】Mongoose 模型中的自定义实例或静态方法中的验证错误【英文标题】:Validation errors in custom instance or static methods in a Mongoose model 【发布时间】:2014-09-11 10:54:03 【问题描述】:

我有一个带有 Meeting 和 Participants 数组的基本 Mongoose 模型:

var MeetingSchema = new Schema(
    description: 
        type: String
    ,
    maxNumberOfParticipants: 
        type: Number
    ,
    participants: [ 
        type: Schema.ObjectId,
        ref: 'User'
     ]
);

假设我想验证添加的参与者数量不超过该会议的 maxNumberOfParticipants。

我已经考虑了几个选项:

    自定义验证器 - 我不能这样做,因为我必须针对另一个 (maxNumberOfParticipants) 验证一个属性(参与者长度)。 中间件 - 即预保存。我也不能这样做,因为我通过 findOneAndUpdate 添加参与者(除非我使用 save,否则不会调用这些参与者)。 添加验证作为我的 addParticipants 方法的一部分。这似乎是合理的,但我不确定如何从模型中传回验证错误。

请注意,我不想在控制器(express、MEAN.js 堆栈)中实现验证,因为我想在模型上保留所有逻辑和验证。

这是我的 addParticipants 方法:

MeetingSchema.methods.addParticipant = function addParticipant(params, callback) 
  var Meeting = mongoose.model('Meeting');
  if (this.participants.length == this.maxNumberOfParticipants) 
      // since we already have the max length then don't add one more
      return ????
  
  return Meeting.findOneAndUpdate( _id: this.id ,
       $addToSet:  participants: params.id  ,
      new: true)
      .populate('participants', 'displayName')
      .exec(callback);
;

不确定在这种情况下如何返回验证错误,或者即使这种模式是推荐的方法。

【问题讨论】:

在我的好朋友 digger69 的帮助下,我想要回传一个错误:callback(errors: [message: 'Too many members']);这在我们使用的 mean.js(样板文件)的上下文中有效,似乎是一个很好的答案,但我很好奇这是否仍然是正确的方法。 【参考方案1】:

我认为这不是在 mongoose 架构级别完成的常见做法。通常,您将在被调用的函数和执行某种验证(例如检查最大计数)的数据库层(您的模式)之间有一些东西。您可能希望您的数据库层只负责进行简单/基本的数据操作,这样您就不必担心当/如果有其他任何东西调用它时任何额外的依赖关系。这可能意味着您需要使用您建议的路线 1,是的,您需要执行数据库请求以了解您当前的参与者数量,但我认为从长远来看它会对您有所帮助:)

【讨论】:

感谢您的回复。我认为您是在建议我的 #1 自定义验证器,但这将在架构级别,对吗?此外,为了做到这一点,我需要一个额外的数据库调用(正如你提到的),如果我在执行我的函数时已经拥有所有数据,这似乎不正确。

以上是关于Mongoose 模型中的自定义实例或静态方法中的验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose“静态”方法与“实例”方法

Nest.js 为模型创建静态和实例函数的方法是啥?

Mongoose 中的方法和静态有啥区别?

XCode故事板中的自定义静态表格单元格?

mongoose 5.7.0 中的自定义验证

Mongoose 中的自增字段