1

内部サーバー エラーをユーザーに伝達するためのベスト プラクティスがあるかどうか疑問に思っています。IE は実際のエラーではなく (サーバー側でログに記録します)、少なくとも 500 とメッセージです。

私は現在持っています:

  app.use(function(err, req, res, next) {
    console.error(err.stack);
    res.send(500, 'Internal server error, please contact server administrator.');
  });

エラーがスローされた場合にサーバーがクラッシュすることを除いて、これは素晴らしいことです (予想されます)。

そのため、現在、すべてのエラーを高速ルートに伝播しています。

  app.get('/api/users', function (req, res, next) {
    User.getUsers(function (err, users) { // err comes back in function
      // dont throw err here in callback
      // throw err;

      // Instead call next with the error to let express now something bad happened
      if (err) return next(err);

      res.json(users);
    });
  });

これは、同じコード行を持つ 30 のルートがあることを除けば、うまく機能します。

  if (err) return next(err);

大したことではありませんが、「より良い」方法があるかどうか疑問に思います。

ありがとう。

4

1 に答える 1

1

EDIT : OP は、エラーが高速ルートに伝播するのを避けたいと考えています。

node.js 0.6.x 以降、 local のように動作するdomainprocess.on('uncaughtExceptionを使用できます…)`。Express を使用して node.js ドメインで例外を処理できないなど、それをカバーするいくつかの質問が既にあります。

秘訣は、各リクエストに個別のドメインをアタッチすることです。

app.use(function(req, res, next) {

  var reqDomain = domain.create();
  reqDomain.add(必須);
  reqDomain.add(res);
  reqDomain.on('エラー', function(err) {
    console.log("Req ドメイン エラー: " + err);
    res.send(500、err.message);
  });

  次();
});

例外が発生するたびに、処理されたドメイン エラーが呼び出され、応答オブジェクトにアクセスして 5XX コードを送信できます。

ただし、ドキュメントに記載されているように、これが発生した場合は、現在の接続をクリーンアップした後、常に node.js プロセスをすぐに終了する必要があります。

考慮すべきもう 1 つの点は、同じドメインにとどまることを確認する必要があることです。外部モジュールを呼び出すときはいつでもこれを使用します。

exports.preserveDomain = 関数 (楽しい) {
  var d = process.domain;

  関数を返す () {
    var args = 引数;

    d.run(関数 () {
      fun.apply(ヌル、引数);
    });
  };
};
于 2013-07-04T15:47:26.660 に答える