在Mongoose模型中,可以使用内置的验证器或自定义验证器来验证文档中的数据。自定义验证器允许您执行更高级别的验证,例如在数据库中执行异步操作进行验证。以下是一种解决方案,可让您使用异步自定义验证器来验证Mongoose模型中的数据。
首先,在定义模型时,将验证器指定为异步函数,它将返回一个解析为true或false的Promise。例如,以下示例定义一个User模型,该模型包含一个电子邮件字段,该字段使用异步自定义验证器验证电子邮件是否唯一。
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
email: {
type: String,
required: true,
unique: true,
validate: {
validator: async function(value) {
const user = await this.constructor.findOne({ email: value });
if(user) {
return false;
}
return true;
},
message: 'Email already exists!'
}
}
});
const User = mongoose.model('User', userSchema);
在上面的示例中,validate属性是一个包含validator和message属性的对象。validator属性包含异步函数,该函数在验证期间将执行。如果该函数返回false,则验证失败,并返回由message属性指定的错误消息。
请注意,要在自定义验证器函数中引用模型的其他字段,请使用this关键字。例子中的this.constructor引用了User模型本身。
现在,您可以像通常一样使用模型进行Mongoose CRUD操作。当您尝试使用已存在的电子邮件创建用户时,验证器将返回验证失败的错误消息。
const user = new User({
email: 'test@test.com'
});
user.save()
.catch(error => console.log(error.message)); // Email already exists!
希望这个解决方案能为您解决使用异步自定义验证器验证Mongoose模型中的数据的问题。
上一篇:AsyncCrudAppService使用TCreateInput和TUpdateInput时会破坏Swagger的问题。
下一篇:async代码设计错误UnhandledPromiseRejectionWarning:Error[ERR_HTTP_HEADERS_SENT]