3

node-mongodb-nativeドライバーを使用しています。私は試した

collection.findOne({email: 'a@mail.com'}, function(err, result) {
  if (!result) throw new Error('Record not found!');
});

しかし、エラーは mongodb ドライバーによってキャッチされ、Express サーバーは終了します。

この場合の正しい方法は何ですか?

===編集===

app.js に以下のコードがあります

app.configure('development', function() {
    app.use(express.errorHandler({dumpExceptions: true, showStack: true}));
});

app.configure('production', function() {
    app.use(express.errorHandler());
});

関連コードnode_modules/mongodb/lib/mongodb/connection/server.js

connectionPool.on("message", function(message) {
    try {
        ......
    } catch (err) {
      // Throw error in next tick
      process.nextTick(function() {
        throw err; // <-- here throws an uncaught error
      })
    }      
});
4

3 に答える 3

6

正しい使い方は、エラーをスローすることではなく、関数に渡すことですnext。まず、エラー ハンドラを定義します。

app.error(function (err, req, res, next) {
    res.render('error_page.jade');
})

(非難されているというこの話は何errorですか?私はそれについて何も知りません。しかし、その場合でも、単に使用できますuse。メカニズムは同じです。)

ルートで、次のようにエラーをハンドラーに渡します。

function handler(req, res, next) {
    collection.findOne({email: 'a@mail.com'}, function(err, result) {
        if (!result) {
            var myerr = new Error('Record not found!');
            return next(myerr); // <---- pass it, not throw it
        }
        res.render('results.jade', { results: result });
    });
};

(応答に関連する)他のコードが後で起動されないようにしてくださいnext(myerr);(それが私がそこで使用した理由ですreturn)。

補足:非同期操作でスローされたエラーは、Express では適切に処理されません (まあ、実際には多少処理されますが、それは必要なものではありません)。これにより、アプリがクラッシュする可能性があります。それらをキャプチャする唯一の方法は、

process.on('uncaughtException', function(err) {
    // handle it here, log or something
});

ただし、これはグローバルな例外ハンドラです。つまり、これを使用してユーザーに応答を送信することはできません。

于 2012-07-15T20:05:11.433 に答える
0

mongodbからのエラーのチェックに関しては、エラーの場合は「!result」ではなく、成功の場合は「!error」を使用します。

collection.findOne({email: 'a@mail.com'}, function(err, result) {
    if (!error) {
        // do good stuff;
    } else {
        throw new Error('Record not found!');
    }
});

カスタム404については、ノードとエクスプレスではまだ実行していませんが、「app.router」が含まれると思います。

于 2012-07-15T19:45:34.153 に答える
0

エラーがキャッチされていないと思います。Express エラー ハンドラを使用していますか? 何かのようなもの:

app.error(function (err, req, res, next) {
 res.render('error-page', {
  status: 404
 });

Express でのエラー処理の詳細: http://expressjs.com/guide.html#error-handling

于 2012-07-15T19:39:04.730 に答える