2017-03-21 10 views
0

私はAPIに関する質問があります。 expressがNode.jsスタイルのコールバックを実装しない理由、つまりエラーファーストコールバック?例えばExpressでNode.jsスタイルのコールバックが実装されないのはなぜですか?

router.METHOD

router.get('/', function(req, res){ 
    res.send('hello world'); 
}); 

さらに、私もこのError handling見た:そして、

app.use(function (err, req, res, next) { 
    // logic 
}) 

を、私の質問は次のとおりです。後に上記のようミドルウェアの取り扱いエラーを追加し、することができます自分のコードを次のように見なしますか?

router.get('/', function(err, req, res, next){ 
    res.send('hello world'); 
}); 

もしそうなら、私はスタイルの権利を約束するコールバックスタイルを変換Q.denodeifyを使用することができていますか? here述べたようにQ.denodeifyので、唯一Node.jsのスタイル(err, result)コールバックのAPIを扱う

+0

APIリクエストを操作する前に、どのようなエラーが予想されますか? – Rayon

+0

@Rayon私の最初の質問は次のとおりです。* expressはNode.jsスタイルのコールバック、つまりエラーファーストコールバックを実装していないのはなぜですか?あなたの質問に答えるには:私は自分のネストされたコールバックを約束に移行したいと思います。しかしおそらくあなたが正しいと思うので、私は 'router.get'の最初のコールバックから始めなければならないわけではありません。 – fluency03

+0

'API'リクエストのハンドラ関数に' error'の可能性はありません... – Rayon

答えて

3

アンExpressのルートハンドラは、約束のように表すことができません。

Expressは実際にノードスタイルコールバックを適切に使用します。 next(err)

次に、私の質問は、エラー処理ミドルウェアを上記のように追加した後、私のコードを次のように見なすことができますか?

エラーハンドラのポイントを倒すことができます。従来のExpressアプリケーションでは、要求がエラーで失敗した場合、その後のルートハンドラを安全にスキップして、代わりにエラーハンドラに渡すことができます。

すべてのルートをエラーハンドラとして記述すると、成功を処理するコード部分とエラーを処理する部分の間に意味的な区別はありません。ルートハンドラがnext(err)をスローまたは呼び出した場合、エラーは専用のエラーハンドラではなく、次の一致するアプリケーションルートハンドラに渡されます。

これは、Expressが構築されているHTTPミドルウェアの実装Connectに関するさらに詳しい質問です。

+0

* "できます" *:これを行うと、Q.denodeify(router.get.bind。(router))、 'Q.denodeify'は' router.get'がコールバックを持っているとみなします'function(err、req、res、next){...}'のようなものですか? – fluency03

+0

いいえ、ルータは機能ではないため、ラップすることはできません。また、エラーハンドラではdenodeifyを使用することもできません。なぜなら[0引数関数を返す](https://github.com/kriskowal/q/blob/v1/q.js#L1944-L1950)です。[connect will tr​​eatルートハンドラとして](https://github.com/senchalabs/connect/blob/master/index.js#L233-L240)には、4つ以下の引数があるためです。 –

+0

明白な約束の統合が明示的にどのようなものかを見たい場合は、[express-promise-router](https://www.npmjs.com/package/express-promise-router)を見てください。 –

0

それがないが、この場合には、あなたがルーターを使用していて、これらのエラーを処理したい場合は、最後にエラーミドルウェアを宣言する必要がありますファイルの done()コールバックが最初の引数errと2番目のdoneをとります。これはnode.jsが使用するのとまったく同じコールバックスタイルです。ルートハンドラは実行何倍する必要があり、一方、一度約束実行ので

関連する問題