2016-11-15 78 views
0

我正在創建一個與數據庫交互(使用sequelize)的nodejs應用程序。現在,我的要求是在數據庫連接出現問題時發出警報(snmp陷阱)。NodeJS - AOP爲數據庫異常執行通用操作

我可以使用。那麼下面實現這一點()趕上():

db.myModel.find(...) 
.then(function() { //do some processing }) 
.catch (function(e) { 
    // TODO: write code to send an alert 
    // ... 
}) 

上面代碼的問題是,我必須在整個代碼重複幾次,無論我做DB歡聲笑語。

我一直在尋找像AOP(Aspect Oriented Programming)這樣更簡單的方法。事實上,我發現了幾個庫(herehere),但是我沒有找到任何方法來執行建議,如果流程進入catch塊。

在Java的情況下,我們有一個工具來捕獲異常切入點。我想知道我們是否有類似的功能。

+1

也許你是過度工程呢?更透明的方式就是編寫一個模塊,導出每個''.catch''塊調用的函數?像''.catch(myDBErrorHandler)''。 如果您使用Express,您可以在其中定義中間件,您可以定義一箇中間件來處理Sequelize Error實例的所有錯誤,並且只需「.catch(next)」。 我一直是一名Java開發人員,我知道過度工程很容易在你身後留下你的餘生。 – tiblu

回答

0

aopromise最新的一個(不幸的是沒有記錄)的功能是將錯誤處理程序組件添加到通知中。 In the tests這裏有一個例子,其中第三個處理函數捕獲pre,fn或post階段發生的每一個錯誤。

以下是創建記錄器方面記錄錯誤和「重新拋出」錯誤的示例。您可以在自己的實現中決定是否要處理或將錯誤轉發給調用者。

module.exports = function LoggerAspect(options) { 
    return new AspectFrame(
     function (preOpts) { 
      console.log(options || '', preOpts.originalFunction.name, 'was called with', preOpts.args); 
     }, 
     function (postOpts) { 
      console.log(options || '', postOpts.originalFunction.name, 'returned with', postOpts.result); 
     }, 
     function (err) { 
      console.error(options || '', postOpts.originalFunction.name, 'throw an exception with', err); 
     } 
    ); 
}