9

Node.js での例外処理について何時間も読んできました。を使用することの短所をuncaughtException理解しています。プロセスをシャットダウンすることは、「何かが起こる可能性がある」「不明な状態」を防ぐのに適していることを理解しています。ドメインを使用することが道であることを理解しており、ドメイン、特に明示的バインディングを適切に実装する方法を理解しています...

...しかし、基本的なエラー処理だけではまだ結果が得られません。

ロギングの目的で、キャッチされていない例外をキャッチできるようにしたいと考えています。プロセスやその他の「望ましくない」と見なされるものを強制終了してもかまいません。ログが欲しいだけです。

すべてを try/catch でラップしたり、ライブラリを使用してemitエラーを発生させたりする必要があるとは思いません...間違っている場合は修正してください。方法を変更します。

Node と Express を使用しており、次の簡単なコードがあります。

var express = require('express');
var domain = require('domain');

var serverDomain = domain.create();
serverDomain.on('error', function(err) {
    console.log("SERVER DOMAIN ERROR: " + err.message);
});

serverDomain.run(function() {
    var app = express();
    app.get('/testing', function() {
        app.nonExistent.call(); // this throws an error
    });

    var server = app.listen(8000, function() {
        console.log('Listening on port %d', server.address().port);
    });
});

エラーはコンソールに表示されますが、コンソールは「SERVER DOMAIN ERROR...」メッセージを受け取りません。また、リクエスト/レスポンスを独自のドメインにラップしようとしましたが、役に立ちませんでした。さらにがっかりするのは、以下を使用しても機能しないという事実です。

process.on('uncaughtException', function(err) {
    console.log('uncaughtException caught the error');
});

私は何か間違ったことをしていますか?ここからどこへ行けばいいですか?上記のエラーをキャッチするにはどうすればよいですか?

4

2 に答える 2

5

これは、Express が表示される可能性のあるエラーを独自に処理し、このようにして作業を簡素化するために発生します。エラー処理については、エクスプレス ガイドを参照してください。表示される可能性のあるエラーを処理するには、以下の構造を使用する必要があります。

app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
});
于 2014-05-27T07:43:31.687 に答える
5

connect-domainを使用できます。

問題は、Connect のルーティング中に例外が発生することです。Connect のルーティングには、その実行に関する try/catch ブロックと、非運用モードでの実行時にスタック トレースの詳細を出力するデフォルトのエラー ハンドラの両方があります。例外は Express の内部で処理されるため、ドメインが処理する外部レイヤーに到達することはありません。

ドメインの代わりに connect-domain パッケージを使用する理由の例を次に示します。

http://masashi-k.blogspot.com/2012/12/express3-global-error-handling-domain.html

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

var app = express();
app.use(connectDomain());
app.get('/testing', function() {
    app.nonExistent.call(); // this throws an error
});

app.use(function(err, req, res, next) {
    res.end(err.message); // this catches the error!!
});

var server = app.listen(8000, function() {
    console.log('Listening on port %d', server.address().port);
});
于 2014-05-27T10:23:20.530 に答える