2016-11-15 24 views
0

私はnodejsアプリケーションを作成しています。これはデータベースとやりとりする(sequelizeを使用して)。さて、私の要件は、db接続で何らかの問題が発生したときに警告(snmpトラップ)を発生させることです。 。NodeJS - AOPはDB例外の共通アクションを実行します

私は(.then使用してこれを達成することができます)キャッチ()以下のように:

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

上記のコードの問題は、私はDBをやっているところはどこでも私は、コード全体を数回繰り返す必要があるということです訴訟

JavaScriptのAOP(Aspect Oriented Programming)のような簡単な方法を探していました。実際に私はライブラリ(herehere)のカップルを見つけましたが、流れがキャッチブロックに行くなら、アドバイスを実行する方法は見つかりませんでした。

Javaの場合、例外pointcutをキャッチする機能がありました。私はここに同様の機能があるのだろうかと思います。

+1

あなたはこれをオーバーエンジニアリングしているのでしょうか?より透過的な方法は、 '' .catch''ブロックが呼び出す関数をエクスポートするモジュールを書くことだけでしょうか? '' .catch(myDBErrorHandler) ''と似ています。 Expressを使用してミドルウェアを定義できる場合は、Sequelize Errorのインスタンスであるすべてのエラーを処理し、 '' .catch(next) ''だけを持つミドルウェアを定義できます。 私はJava開発者でしたが、オーバーエンジニアリングはあなたの人生の残りの部分であなたに続いていくことは簡単です。 – tiblu

答えて

0

aopromise最新の(残念ながら文書化されていない)機能の1つは、エラーハンドラコンポーネントをアドバイスに追加することです。 In the testsこれには、第3ハンドラが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); 
     } 
    ); 
} 
関連する問題