2012-12-29 6 views
7

私は最近、pgモジュール(https://github.com/brianc/node-postgres)を使用するexpress.jsベースのアプリケーションの作業を開始しましたexpress.jsベースのアプリケーションでのエラー処理の集中化

また、ノードやエクスプレスアプローチのエラー処理、ミドルウェアの適切な設計などのメリットについては、かなりの時間を費やしていましたが、解決策がなくても繰り返し問題が発生しています。

言って、私は次のルータの方法があります:

app.get("/:someThing/:someId", function(req, res, next) { 
    pgClient.query("some SQL query", function(err, data) { 
    if (err) { return next(err); } // some 500 handler will take it 
    if (data.rows.length == 0) { 
     next(); // send it over to a 404 handler 
    } 

    //finally, here we get the chance to do something with the data. 
    //and send it over via res.json or something else 
    }); 
}); 

私が正しく読んでいれば、これはそれを行うための適切な方法でなければなりません。しかし、ネストされた複数のコールバックがある場合には、同じルータメソッドでも何度も何度も書き直すのはあまりにも多くの定型文であることに気づくことでしょう。

私は、このような状況を一元的に処理する最良の方法は何かを尋ねてきました。私のアイデアはすべてpgClient.queryメソッドをインターセプトすることです。 1つは、クエリメソッドは単にコールバックに渡す代わりにエラーをスローします。別の方法では、pgClient.queryの呼び出しは、ルータメソッドをpgClientの隣に送ります。次に、インターセプトされたクエリメソッドは、次に渡される次のものを処理する方法を知ります。

私が知っているので、周りにエラーを投げることは、実際には500人のハンドラにそれを手に入れる適切な方法ではありません。一方、pgClientのオプションとして次のpassinは、私の知識と経験に基づいて上記のレイヤーに関する多くの知識を低レベルで提供し、カップリングにつながり、どちらもあまり良くありません。

あなたはどう思いますか?

+0

'/:サムシング/:someId'? –

+0

はい、私はそれを変更しました – user1219569

+0

いいえ、私はすべての500件のリクエストについて1つのルートを考えました。 –

答えて

11

connect-domainミドルウェアを使用できます。 connectexpressで、Doman APIに基づいて動作します。

connect-domainミドルウェアを最初のミドルウェアとしてスタックに追加する必要があります。それで全部です。これで、非同期コードのどこにでもエラーをスローすることができ、ドメインミドルウェアで処理され、明示エラーハンドラに渡されます。

簡単な例:

// Some async function that can throw error 
var asyncFunction = function(callback) { 
    process.nextTick(function() { 
     if (Math.random() > 0.5) { 
      throw new Error('Some error'); 
     } 
     callback(); 
    }); 
}; 

var express = require('express'); 
var connectDomain = require('connect-domain'); 

var app = express(); 
app.use(connectDomain()); 
// We need to add router middleware before custom error handler 
app.use(app.router); 

// Common error handler (all errors will be passed here) 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.send(500, 'Something broke!'); 
}); 

app.listen(3131); 

// Simple route 
app.get('/', function(req, res, next) { 
    asyncFunction(function() { 
     res.send(200, 'OK'); 
    }); 
}); 
関連する問題