2015-06-14 213 views
2

當使用自定義模型驗證程序來檢查模型中的記錄時。價差回報似乎並沒有結束控制流。自定義模型驗證程序SailsJS

//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" 
     } 
    ] 
    } 
} 

回答

2

看起來像你想要的「返回true並返回false」是isUserValid函數的返回值。但事實上它不是如何在JavaScript範圍工作。返回語句在您的傳播函數中返回true僅意味着承諾以「真實」解決。它不作爲函數返回。函數isUserValid仍然不返回任何內容。如果這個功能可以是一個異步的承諾。你至少應該回報這個承諾。

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

INFACT它canbe簡化

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

但是,如果此功能不支持承諾,這意味着它是同步的,並希望真/假將被返回,而不是承諾的對象。你必須使這個過程同步。將承諾轉換爲同步的一種方法是使用生成器函數。見here