自定义模型validation器SailsJS

使用自定义模型validation程序检查模型中的logging时。 价差的回报似乎并没有结束控制stream。

//Post.js Model /** * Custom Validator **/ types: { isUserValid: function(user_id) { var Promise = require('bluebird'); Promise.all([ User.findOne({id: user_id}) ]) .spread(function(user) { console.log(user); if (user === null || user === undefined) { console.log('failed'); return false; }else{ console.log('passed'); return true; } }); } }, 

我的回应是一个标准的validation失败的回应。

 { "error": "E_VALIDATION", "status": 400, "summary": "1 attribute is invalid", "model": "Post", "invalidAttributes": { "owner": [ { "rule": "isUserValid", "message": "\"isUserValid\" validation rule failed for input: 1" } ] } } 

看起来像你想要的“返回true和返回false”是isUserValid函数的返回。 但实际上它不是如何在JavaScript作用域。 return函数在你的传播函数里返回true只意味着promise被“true”解决。 它不作为函数返回。 函数isUserValid仍然不返回任何内容。 如果这个function可以是一个asynchronous的承诺。 你至less应该回报这个承诺。

 return Promise.all([....]).spread..... 

事实上它可以被简化

 return User.findOne(user_id).then(function(u){....}) 

但是,如果这个函数不支持承诺,意味着它是同步的,并且期望返回true / false,而不是promise对象。 你必须使这个过程同步。 一种将承诺转换为同步的方法是使用生成器函数。 看到这里