2015-11-07 39 views
1

我的諾言堆內深處,我做這樣的判斷:爲什麼node.js/bluebird吃了一個異常?

function isNameAvailable(name) { 
    return registry.getName(name) 
     .then(function(result) { 
      return result ? false : true; 
     }); 
} 

不幸的是,這是一個編程錯誤,註冊表是不確定的。我的node.js應用程序沒有打印任何錯誤消息。任何想法爲什麼?我正在使用藍鳥許諾庫。

編輯

這裏的調用代碼。我剛剛添加了該捕獲物,但沒有捕獲任何東西。

function _checkAvailability(name) { 
    return isNameAvailable(name) 
     .then(function(isAvailabile) { 
      if (isAvailabile) { 
       return true; 
      } 
      else { 
       throw new NameNotAvailable('Name "' + name + '" is not available'); 
      } 
     }) 
     .catch(function(error) { 
      console.log('isNameAvailable threw', error); 
      throw error; 
     }) 
} 

堆棧應該最終回滾到由express.js作爲HTTP請求的結果調用的函數。這是一個地方,我捕獲所有的錯誤和打印堆棧跟蹤(但顯然它不打印任何東西):

function createUser(req, res) { 
    userService.createUser(req.body) 
     .then(function(user) { 
      res.status(201).send(user); 
     }) 
     .catch(function(error) { 
      log.trace(error); 
      res.status(500).send({'message': error.toString()}); 
     }); 
} 
+0

你在哪裏調用'isNameAvailable'?它確實拋出。 – Bergi

+0

你能分享更多的代碼嗎?由此我猜測問題是你沒有捕捉到錯誤。 –

+0

請參閱我的編輯該代碼的調用者。 – Naresh

回答

0

編輯,以反映您的更新:

納雷什是正確的,你需要如果拋出的話,返回一個被拒絕的承諾。你可以嘗試

function isNameAvailable(name) { 
    try { 
     return registry.getName(name) 
     .then(function(result) { 
      return result ? false : true; 
     }); 
    } catch(e){ 
     return Promise.reject(e) 
    } 
    } 

看到這篇文章錯誤吞嚥在深刻的承諾。

http://www.mattgreer.org/articles/promises-in-wicked-detail/#promises-can-swallow-errors-

+0

請查看我編輯的此代碼的調用者。 – Naresh

相關問題