2

ノードを数か月使用しています。非同期コードでのエラー処理については、私が認識しているベスト プラクティスに従っています。これは、コールバック エラー引数を介してエラーを処理し、ほとんどの例外が発生してアプリをクラッシュさせることです。きれいに回復する方法。

私は現在、Qを使用する開発者と一緒にプロジェクトに取り組んでおり、彼は Q.nfbind を使用するラッパーで私のコールバック ベースの関数のいくつかを呼び出しています。ただし、これにより、エラー処理が頭を悩ませています。たとえば、エラーでコールバックできる関数があるとします。

function doSomething(x, callback) {
    dbpool.acquire(function(err, conn) {
        if (err) return callback(err);

        conn.query('INSERT INTO some_table (x) VALUES (?)', [x],
        function(err, result) {
            dbpool.release(conn);
            if (err) return callback(err);
            callback(null, result.insertId);
        });
}
var qDoSomething = Q.nfbind(doSomething);

QI を使用すると、qDoSomething を呼び出して、エラーを正常に処理できます。

qDoSomething('abc')
.fail(function(err) {
     ...
});

ここで、ある夜遅くまで仕事をしていて、クエリの直前に doSomething() 関数内で次のようなコードをチェックインしたとします。

var foo;
foo.doAnotherThing();

私のプレQの世界では、これは悪いことです。例外がスローされ、アプリがクラッシュし、永遠に再起動されます。ただし、アプリを再起動すると、少なくともこのコード パスが再びヒットするまで機能します。ただし、Q では、この例外がキャッチされ、fail ハンドラによって処理されるようになりました。このハンドラーは、接続プールについて何も知らないため、損傷を修復できません。現在、このコード パスがヒットするたびに、プールから接続がリークされ、最終的にアプリがブリックされます。このバグの影響は、ひどいものからひどいものになりました。

Q で、最初にスローされたエラーとコールバック エラーによって発生したエラーを区別する方法がわかりません。すべてを処理するか、何も処理しないかで行き詰まっているようです。ひどい状態から悪い状態に戻る方法を誰か提案できますか?

4

1 に答える 1

1

Errorそれらをラップするためにサブクラス化するerrのはどうですか?

var MyError = function() {
  Error.apply(this, arguments);
};

var generateError = function(callback) {
  callback(new MyError('some reason'));
};
var doSomething = q.nfbind(generateError);

doSomething()
  .fail(function(e) {
    console.log('Was this a MyError instance?', e instanceof MyError);
  });
于 2013-02-21T15:13:36.097 に答える