2017-07-28 18 views
1

だから、些細なことです。Express.jsはどのようにエラーを処理しますか?

UPDATE:この質問エクスプレスで我々はExpressが組み込まれていることなどにReferenceError、例外TypeError、のような「同期例外」を処理するための四つの引数(errは、REQ、RES、次を)期待して、デフォルトのエラーハンドラを知っているすべての処理されない例外などを捕まえる方法ではありません。私は最初のコードブロックでExpressがユーザー定義の例外をどのように処理できるかを知りたい。 asyncを使用した2番目の例。例外は直接この質問には属しません。

const express = require('express')(); 

express.all('*', (req, res) => { 
    throw new Error('my own error'); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Express is still up and running'); 
}).listen(3000); 

ではなく、この:

const express = require('express')(); 

express.all('*', (req, res) => { 
    process.nextTick(() => { 
    throw new Error('my own error'); 
    }); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Won\'t be executed'); 
}).listen(3000); 

しかし、私はこのハンドラの実現について興味があります。

私は

process.on('uncaughtException'...またはドメイン/約束/クラスタのような何かを見つけることができません。

多分私は何かが恋しいです。

誰でも明示できますか?

答えて

1

実行されますcatch-all kind of block in Express's routerあり:

try { 
    fn(req, res, next); 
} catch (err) { 
    next(err); 
} 

だから、このブロック内のすべての例外はcatchedと next()機能が例外と一致するように設定されたエラーパラメータで呼び出しに変換されます。より詳細には

、要求を表現するために到着:

  • app.handle()は、ルータを決定し、あなたのハンドラがexpress.all('*', ...)署名
  • に登録一致した層を通過し、最終的に router.handle()
  • router.handle()プロセスを呼び出す、と呼ばれています
  • handle_request(内部ルータの内部レイヤーモジュール)は、上記のtry-catchブロックで指定されているハンドラ関数を呼び出し、すべての例外を効果的に捕捉してnに変換しますextコール。
+1

詳細な回答ありがとうございます。私はちょうどその行動を再現するために私自身の「Express」を作った。私にとってはとてもシンプルでエレガントなハンドリング。 – loadaverage

関連する問題