2015-06-15 45 views
0

我對node.js應用程序(MEAN環境)使用bluebird promise。儘管我很難理解異常/錯誤處理。請看下面的代碼:Bluebird在Node.js上承諾:錯誤和異常處理

var Promise = require('bluebird'), 
    library1 = Promise.promisifyAll(require('firstlibrary')), 
    library2 = Promise.promisifyAll(require('secondlibrary')); 

//main 
exports.urlchecker = function(req, res) { 
    library1.doSomething(req.body.url) //--> how to reject this promise? 
     .then(function(response) { 
      if (response == false) { 
       throw new LinkError("URL invalid!"); 
      } 

      library2.Foo(req.body.url) 
       .then(function(response2) { 
        if (response2 == false) { 
         throw new SizeError("URL too long!"); 
        } 
        res.json({ 
         status: true 
        }); 
       }).catch(LinkError, function(e) { //--> causes error! 
        res.json({ 
         status: false 
        }); 
       }).catch(SizeError, function(e) { //--> causes error! 
        res.json({ 
         status: false 
        }); 
       }).catch(function(e) { //--> catch all other exceptions! 
        res.json({ 
         status: false 
        }); 
       }); 
     }); 
}; 

library1 - promisified:

exports.doSomething = function(url, cb) { 
    if (whatever == 0) { 
     cb(null, false); //--> what to return to reject promise? 
    } else { 
     cb(null, true); 
    } 
}; 

我現在有兩個問題。

  1. 我必須從library1返回以獲得承諾否決?如果不是通過返回值,我該怎麼做?
  2. 如何定義和捕獲我自己的異常?以上導致該錯誤代碼:

    Unhandled rejection ReferenceError: LinkError/SizeError is not defined 
    
+0

根據庫1的響應,我想立即切割諾言鏈( - > library2將不會被調用),並向客戶端迴應錯誤。 –

回答

1

.promisify*()變成常規Node.js的回調約定成承諾。該慣例的一部分是將錯誤作爲第一個參數傳遞給回調函數。

換句話說,要拒絕承諾,請使用cb(new Error(...))

例子:

var Promise = require('bluebird'); 

var library1 = { 
    // If `doFail` is true, "return" an error. 
    doSomething : function(doFail, cb) { 
    if (doFail) { 
     return cb(new Error('I failed')); 
    } else { 
     return cb(null, 'hello world'); 
    } 
    } 
}; 

var doSomething = Promise.promisify(library1.doSomething); 

// Call that resolves. 
doSomething(false).then(function(result) { 
    console.log('result:', result); 
}).catch(function(err) { 
    console.log('error:', err); 
}); 

// Call that rejects. 
doSomething(true).then(function(result) { 
    console.log('result:', result); 
}).catch(function(err) { 
    console.log('error:', err); 
}); 

至於失蹤的錯誤類型:我認爲它們是由secondlibrary出口因此使用library2.LinkError,而不只是LinkError。如果它們未被導出,則不能明確地捕獲它們。

+0

這是做到這一點的正確方法 - 它實際上與promise沒有任何關係,它只是如何處理節點errbacks。您可能還想解決第二個問題(子類錯誤)。 –