这是我的用户架构:
E1
我想验证至少有一个var userSchema = mongoose.Schema({
username: { type: String, required: true, unique: true },
role: String,
auth: {
hashedPassword: { type: String, select: false },
facebookToken: { type: String, select: false },
twitterToken: { type: String, select: false },
googleToken: { type: String, select: false }
},
});
属性存在。我该怎么做?
在查看docs进行自定义验证时,您似乎只能在给定字段上添加自定义验证器。
答案 0 :(得分:1)
我认为您想在这里nested schema。
const authSchema = mongoose.Schema({
hashedPassword: { type: String, select: false },
facebookToken: { type: String, select: false },
twitterToken: { type: String, select: false },
googleToken: { type: String, select: false }
});
可以在您的主模式中使用:
const UserSchema = mongoose.Schema({
username: { type: String, required: true, unique: true },
role: String,
auth: {
type: authSchema,
required: true,
validate: {
validator: function(s) {
const MIN_LENGTH = 6;
return (
this.auth.hashedPassword.length >= MIN_LENGTH ||
this.auth.facebookToken.length >= MIN_LENGTH ||
this.auth.twitterToken.length >= MIN_LENGTH ||
this.auth.googleToken.length >= MIN_LENGTH
);
}
}
}
});
但这还不够。您可能已经知道,验证不会在尚未分配值的属性上运行。因此,当我最近尝试在POST端点上执行类似操作时,我添加了代码,为要强制验证的所有属性分配空字符串值。
例如,在Express端点中,您可能会执行以下操作:
const postUser = async (req, res) => {
const postedUser = req.body;
let userObj = Object.assign({}, postedUser);
userObj.auth.hashedPassword = userObj.auth.hashedPassword || "";
userObj.auth.facebookToken = userObj.auth.facebookToken || "";
userObj.auth.twitterToken = userObj.auth.twitterToken || "";
userObj.auth.googleToken = userObj.auth.googleToken || "";
..在验证模型之前。
答案 1 :(得分:0)
我认为这应该有效:


 var user = require('。/ path / to / userSchema');
&#xA ; var detectAuthMethod = function(userName,callback){
 user.findOne(用户名:username,function(err,doc){//按userName字符串查找用户。需要userName。
 if(错误)throw err;
 for(doc.auth中的var key) ){//遍历所有doc.auth键
 if(doc.auth.hasOwnProperty(key){//检查它们的键是否已设置
回调(null,key); //回调“返回”状态成功(null),响应是设置密钥。
}
}
回调('错误,没有有效密钥。'); //回调“返回”。状态是一条错误消息,没有响应键。
});
}



 然后你可以从源文件中调用函数,如下所示:


 detectAuthMethod('bob',function(err,key){
 if(err) throw err;
 console.log('Bob已通过%s key',密钥验证);
});


&# xA; 如果你需要从其他地方(而不是源文件)调用该函数,那么在源文件的末尾添加它应该是enoug h:


 module.exports.detectAuthMethod = detectAuthMethod;



 然后从其他地方请求源文件并像往常一样使用它。

答案 2 :(得分:0)
如果有人想像我一样,您可以这样验证
Array{Float64}(undef, i...)