我目前正在尝试为我的架构添加自定义验证器。由于某种原因,我无法查询数据库。有谁知道我的问题的解决方案?
这是架构:
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感觉就像是最干净的条目。
希望你有一个解决方案。非常感谢提前!
杰弗里
答案 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(否则验证器将被忽略,因为它没有任何值而且不需要)