私は自分のアプリケーションのエラーを処理するための完璧な方法を見つけようとしています。私は方法を考案しましたが(以下を参照)、元のエラーが失われるという事実に悩まされています。
私のコードには次のようなものがあります(これはミドルウェアです):
exports.tokenApi = function( req, res, next, token ){
Workspace = mongoose.model('Workspace');
User = mongoose.model('User');
req.application = {};
// Find the token
Workspace.findOne({ 'access.token': token } , function(err, doc){
if(err){
next( new g.errors.BadError503('Database error resolving workspace Id') );
} else {
if(! doc ){
next( new g.errors.ForbiddenError403('Access denied') );
} else {
// The token is there and it's valid.
// Set req.application.workspaceId, req.application.login and
// req.application.workspace (which contains all of the settings!)
req.application.workspaceId = doc._id;
req.application.workspace = doc;
req.application.login = doc.access.filter(function(entry){ return entry.token == token; } )[0].login;
next();
}
}
別のファイルでエラーが定義されています。
// Defining the BadError error type, thrown by the application itself
//
function BadError503( message ){
this.httpError = 503;
this.message = message || "Internal error";
this.name = this.constructor.name;
}
util.inherits(BadError503, Error);
exports.errors.BadError503 = BadError503;
// Defining the Error error type, thrown by the application itself
//
function ForbiddenError403( message ){
this.httpError = 403;
this.message = message || "User not logged in";
this.name = this.constructor.name;
}
util.inherits(ForbiddenError403, Error);
exports.errors.ForbiddenError403 = ForbiddenError403;
アプリケーションは、次のようなエラーハンドラを定義します。
exports.AppErrorHandler = function( err, req, res, next){
var user = null;
var workspace = null;
switch(err.name){
case 'BadError503':
case 'ForbiddenError403':
Logger(null, null, 4, 'The application threw an error: ' + err.name + ', message: ' + err.message, req );
res.json( { message: err.message }, err.httpError );
break;
このコードの問題は、元のエラーが失われることです。私は、いわば「正しいことをする」カスタムエラーハンドラーを持っています(上記のコードを参照してください:Ajax経由でエラーを返します)が、実際の問題の理由を何らかの形で保持したいのですが。
これは私に別の質問をもたらします:これは悪い習慣ですか?ある意味で、私は自分自身のエラーをスローし、それを100%処理できるという事実が好きです(私は自分でErrorオブジェクトを作成しました)。しかし、元のエラーを失うことは私には悪い考えのように思えます。
元のエラーを、作成したカスタムエラーのオブジェクトに渡すことができます。それでも...
何かご意見は?または、私が知っておくべき標準的なパターンはありますか?