2

使用自定义模型验证器检查模型中的记录时。价差内的回报似乎并没有结束控制流。

//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;
          }
        });
    }
  },

我的回复是标准验证失败回复。

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

1 回答 1

2

看起来您希望“返回 true 并返回 false”作为 isUserValid 函数的返回值。但实际上这不是 javascript 范围的工作方式。您的传播函数中的 return 语句 return true 仅表示承诺以“true”解决。它不作为函数返回。函数 isUserValid 仍然不返回任何内容。如果这个函数可以是一个异步承诺。你至少应该回报承诺。

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

事实上它可以简化

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

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

于 2015-06-15T14:43:27.077 回答