const UserSchema = new Schema({
email: {
type: String,
required: [true, "An email address is required."],
validate: validateEmail,
},
})
async function validateEmail(email) {
if (!isEmail(email)) throw new Error("Please enter a valid email address.")
const user = await this.constructor.findOne({ email })
if (user) throw new Error("A user is already registered with this email address.")
}
3条答案
按热度按时间pgccezyw1#
我更喜欢在注册路线中检查电子邮件的唯一性。
这样,我们就可以完全控制应该向客户端发送哪些状态代码或错误消息。
2vuwiymt2#
您可以使用自定义验证器:
jum4pzuy3#
多自定义验证
要对电子邮件字段运行多个验证检查,您需要为每个验证抛出具有不同消息的错误对象。
在本例中,我指定了3种不同的验证检查,包括唯一性,以及3种不同的自定义错误消息,但您可以根据需要添加任意多的检查。
首先,运行
required
检查,如果为空,则返回第一条验证消息。其次,将函数传递给
validate
字段。在此函数中,email
作为参数传递。isEmail
可以是检查字符串是否为正确的电子邮件格式的任何类型的函数。如果失败,则使用新的错误对象指定错误消息要使用Mongoose验证唯一性,请从answer above运行
findOne
查询,如果返回用户,则使用该验证文本抛出错误。备注
true
或false
。如果验证失败,只需抛出错误,让函数自然解析即可。validate
属性,这一点很重要,因为您需要在函数执行中提供词法作用域范围的this
。