Mongoose:您如何验证至少存在以下字段之一?

时间:2015-08-14 18:20:12

标签: javascript mongoose

这是我的用户架构:

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进行自定义验证时,您似乎只能在给定字段上添加自定义验证器。

3 个答案:

答案 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...)