2017-10-27 7 views
0

私はexpressJSで[email protected]を使用しています。続行のすべてのタイプをキャッチする方法エラー

私は特定のタイプの続行エラーをキャッチする方法を理解しており、うまくいきます。

return db.mySequel.transaction(t => { 
    return db.users.findOrCreate({ 
     ..., 
     transaction: t 
    }).spread((rs, created) => { 
     if (created == false) throw new Error("00001"); 
     return db.misc.bulkCreate([ 
      { 
       ... 
      }, 
      { 
       ... 
      } 
     ], { 
      transaction: t, 
      raw: true 
     }); 
    }) 
}).then(rs => { 
    res.json(rs); 
}).catch(db.mySequel.ForeignKeyConstraintError, err => { 
    ... 
}).catch(err => { 
    ... 
}); 

しかし、このクエリトランザクションプロセスもカスタムエラーインスタンスをスローします。だから私はエラーとは別にすべてのタイプのSequelize Errorを捕捉したい。

多分私はより多くのキャッチチェーンを作ることができました、それは冗長であるようです。 私は.catch(db.mySequel.BaseErrorを試しましたが、あまり役に立ちません。

答えて

0

ドキュメントに記載されているように、エラークラス間で継承関係が見つかりました。

と私はObject.getInstanceOf()メソッドとの関係をキャッチできました。 __proto__プロパティは意味がありますが、私はより厳密なルールを優先します。

var names = []; 
(function p (inst) { 
    if (inst != null) { 
     var ofProto = Object.getPrototypeOf(inst); 
     names.push(ofProto.constructor.name); 
     p(ofProto); 
    } 
})(err); 
console.log(names) 
// ["ForeignKeyConstraintError", "DatabaseError", "BaseError", "Error", "Object"] 

を、今ではエラーがどこから来るのか知ることができる:(。。__proto__はJavaScriptエンジンのほとんどを採用しているがそれはちょうどデファクト標準です)

これは私が作った方法です。

1

複数のキャッチブロックを使用する代わりに、単一のキャッチブロックを使用して、オブジェクトのinstanceofをテストして、例外の処理方法を判断します。

.catch(err => { 
    if (err instanceof db.mySequel.ForeignKeyConstraintError) { 
    // handle foreign key constraint 
    } else { 
    // handle other error 
    } 
}); 
+0

私は期待された答えではありませんでしたが、ありがとう –

関連する問題