Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sails.js 针对数据库的sails js模型验证_Sails.js - Fatal编程技术网

Sails.js 针对数据库的sails js模型验证

Sails.js 针对数据库的sails js模型验证,sails.js,Sails.js,我正在编写一个自定义验证规则,以检查传递给create函数的“category_id”是否有效 types: { isValidCategoryId: function(id){ return Category.findOne({id: id}).exec(function(err, user){ if(err || !user) return false; else{ return true; } });

我正在编写一个自定义验证规则,以检查传递给create函数的“category_id”是否有效

types: {
  isValidCategoryId: function(id){
    return Category.findOne({id: id}).exec(function(err, user){
      if(err || !user)
        return false;
      else{
        return true;
      }  
  });
 }
},


attributes: {
  category_id : { isValidCategoryId: true, required: true, type: 'string' },
}
我知道我的自定义验证函数应该返回true,但在异步上下文中,这可能不起作用,比如检查DB中的值


如何编写自定义验证函数以使其正确运行?

您可以传入回调并返回结果。这有点奇怪,因为它看起来不像遵循
(err,result)
标准,而是使用
(result)
。尝试一下:

types: {
  isValidCategoryId: function(id, cb){
    return Category.findOne({id: id}).exec(function(err, user){
      if(err || !user)
        return cb(false);
      else{
        return cb(true);
      }  
  });
 }
},

我试过刨花板的溶液。它不起作用,但至少它为我指明了正确的方向

根据文件:

验证规则可以定义为返回要测试的值的简单值或函数(同步和异步)

因此,一个简单的方法是:

attributes: {
    category_id : {
        required: true,
        type: 'string',
        'true': function(cb) {
            Category.findOne({id: this.category_id}).exec(function(err, category){
                return cb(!err && category);
            });
        }
    }
}
正如您所看到的,我只是在这里使用“真正的”验证器,但是您当然可以编写自己的验证器来解决一些更高级的逻辑。这里的关键是您的自定义验证器不是异步的,但是您的验证规则可以是。是的,术语很混乱

下面是另一个使用自定义验证器的示例:

attributes: {
    author: {
        required: true,
        type: 'string',
        canPost: function(cb) {
            Author.findOne(this.author).exec(function(err, author) {
                return cb(author);
            });
        }
    }
},
types: {
    canPost: function(id, author) {
        return author && author.canPost();
    }
}

希望这是有道理的。如果没有,.

什么回调?我怎么通过?我正在编写要在属性中使用的验证:{category_id:{isValidCategoryId:true,required:true,键入:'string'}}}是的,如果传入两个类似的参数,验证程序将异步运行它。在属性数组中添加自定义验证函数时,我观察到我可以传递下面这样的函数
category\u id:{isValidCategoryId:function(result){console.log(result)},required:true,键入:'string'},
正如您在上面所注意到的,我传递的是一个针对属性
category\u id
的函数。该函数确实可以作为自定义验证函数的第二个参数使用,我正在调用该回调函数,并传入所需的true/false。但是,这会导致脚本挂起,并且不会返回响应。@particlebanana我得到的cb为null。有什么问题吗?@particlebanana我在isValidCategoryId中的第二个参数的类型为
boolean
,值为:
true
。那么,这里有什么问题吗?非常感谢。你成就了我的一天,为我节省了几个小时!好!!我很高兴能帮上忙!:)