Mongoose自定义验证器:检查数据库中是否存在值

时间:2017-07-06 22:58:39

标签: mongoose mongoose-schema

我目前正在尝试为我的架构添加自定义验证器。由于某种原因,我无法查询数据库。有谁知道我的问题的解决方案?

这是架构:

var Portfolio = new Schema({
    title: {
        type: String,
        required: [true, 'Title is required']
    },
    thumbnail: {
        type: String,
        required: [true, 'Thumbnail is required'],
    },
    description: String,
    date: Date,
    images: [String],
    categories: [Schema.Types.ObjectId],
    order: Number,
    slug: {
        type: String,
        validate: {
            validator: slugExists,
            message: 'Slug already exists, choose a different title',
        }
    }
}, options);

这是检查数据是否存在的方法:

function slugExists(value) {
    this.model.count({slug: value}, function(err, count) {
        if (error) {
            return err;
        }
        return count > 0;
    });
}

当我运行应用程序时,我收到以下错误消息:

TypeError: this.model.count is not a function

我也试过使用以下内容:

mongoose.model['portfolio'].count(...)

但结果是一样的。

我一直试图将问题解决两个小时,甚至尝试了不同的方法(例如预挂钩)。但是直接将自定义验证添加到Schema感觉就像是最干净的条目。

希望你有一个解决方案。非常感谢提前!

杰弗里

2 个答案:

答案 0 :(得分:1)

可以使用pre-save方法 请考虑以下示例,尝试在用户模型中验证用户名:

   UserSchema.pre('save', function (next) {
   var self = this;
   mongoose.models["User"].findOne({username: self.username}, function (err, user) {
      if (!user) {
          next();
      } else {
          next(new Error("Username already exists!"));
      }
  });

答案 1 :(得分:0)

当我测试不同的解决方案时,我发现了一个回复我的问题的帖子(https://stackoverflow.com/a/26268156/8267696)。

这是我正在寻找的解决方案:

function slugExists(value, callback) {
    this.constructor.count({slug: value}, function(err, count) {
        if (err) {
            next(err);
        }
        callback(count === 0);
    });
}

Portfolio.pre('validate', function(next) {
    this.slug = slugify(this.title);
    next();
});

旁注:将根据标题生成slug。这就是为什么我必须使用'validate'预钩子以便在验证之前已经设置了slug(否则验证器将被忽略,因为它没有任何值而且不需要)