2015-10-04 45 views
1

有下面的代碼:catch異常/ promisses

router.put('/:id', function(req, res, next) { 
    models.Task.find(req.params.id).then(function(task) { 
    return task.updateAttributes({ 
     title: req.body.title, 
     description: req.body.description 
    }); 
    }).then(function(task) { 
    res.json(task); 
    }).catch(function(err) { 
    var err = new Error('Cannot find Task'); 
    err.status = 404; 
    next(err); 
    }); 
}); 

正如你所看到的,我用這條路線由id來更新任務模式。所以,現在我趕上錯誤,如果沒有任何與id的任務,我嘗試更新null對象的屬性(ReferenceError錯誤類型)。所以,我剛剛向任務模型添加了驗證,並且有機會使用空標題/描述(SequelizeValidationError錯誤類型)更新任務。我如何在我的catch塊中處理這些錯誤?我想設置'無法找到任務','無法更新任務'消息這個錯誤。我應該分裂我的catch塊還是其他什麼?提前致謝!

+1

身份證建議使用藍鳥承諾,而不是看到這個答案爲什麼http://programmers.stackexchange.com/questions/278778/why-are-native-es6-promises-slower-and-more-memory-intensive-than -bluebird – baao

回答

1

如果你不願意使用加速和增強了像藍鳥本土承諾的API庫,你可以建立一些功能自己:

function errT(type, fn){ 
    return function(err){ // create a handler for errors 
     if(!(err instanceof type)) throw err; // allow fallthrough if it doesn't match 
     return fn(err); 
    }; 
} 

或類似的在ES2015語法:

let errT = (type, fn) => err => (err instanceof type) ? Promise.reject(err) : fn(err); 

這將讓你這樣做,例如:

promiseReturningFn(). 
    catch(errT(TypeError, handleTypeError)). 
    catch(errT(ReferenceError, handleReferenceError)); 

我我們熱烈地建議你將錯誤的子類別提供給你自己的類型,提供額外的信息並抓住這些信息。我在自己的代碼中發現它是非常積極的做法,它有助於避免意外地捕捉程序員錯誤(而不是應用程序錯誤)。

+0

你能否給我提供使用藍鳥的例子?對我的任務 – malcoauri

+0

@malcoauri基本上,藍鳥這個開箱即用,所以你可以在catch周圍刪除'errT',而不必定義它(它也會更快),所以只需''''''''''''' (TypeError,handleTypeError).catch(ReferenceError,handleReferenceError)'也有內置的'.error'和一個用於應用程序錯誤的'OperationalError'類型,所以你不會意外地沉默程序員錯誤。 –