mongodb 验证器功能在mongoose中不起作用

mitkmikd  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(123)

我想检查我的文档是否有一个媒体URL,所以它应该有一个媒体类型,我添加了这个验证程序

mediaURL: {
                type: String,
                default: ''
            },
            mediaType: {
                type: String,
                enum: ['video', 'photo', 'audio', 'none'],
                validate: {
                  validator: function () {
                    return( (this.mediaURL && this.mediaType) || !this.mediaURL );
                  },
                  message: 'There should be a mediaURL in the post to have a media type',
                }
              },

我正在使用 Mongoose ,它是不工作的,我仍然可以保存文件没有媒体类型,而有一个媒体网址。
我已经尝试了不同的方式来实现这样的验证方式

mediaType: {
    type: String,
    enum: ['video', 'photo', 'audio', 'none'],
    validate: {
        validator: function () {
            if (!this.mediaURL) {
                // No mediaURL, so mediaType is allowed to be empty
                return true;
            }
            return !!this.mediaType; // Ensure mediaType is present when mediaURL is provided
        },
        message: 'There should be a mediaURL in the post to have a media type',
    }
},

但还是不行

flvlnr44

flvlnr441#

您可以执行以下操作:

Schema.pre('validate', function (next) {
  if (this.mediaURL && !this.mediaType) { 
    this.invalidate('mediaType', 'mediaType cannot be empty', this.mediaType);
  }

  next();
});
  1. Schema.pre为模式定义了一个pre-hook。这是一个中间件(而不是验证器函数),因此返回true还是false并不重要。
    执行中间件代码后,需要调用next()来继续执行。
    https://mongoosejs.com/docs/api/schema.html#Schema.prototype.pre()
  2. invalidate()将模式中的路径标记为无效,这将导致验证失败。
    这就是您的自定义验证发生的地方(通过检查mediaURLmediaType)。
    https://mongoosejs.com/docs/api/document.html#Document.prototype.invalidate()

相关问题