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
});

but this is a global exception handler, i.e. you cannot use it to send the response to the user.

于 2012-07-15T20:05:11.433 回答
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 回答
0

在检查 mongodb 的错误方面,使用 '!error' 表示成功,而不是使用 '!result' 表示错误。

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

至于自定义 404,我还没有在 node 和 express 中这样做,但我想它会涉及“app.router”。

于 2012-07-15T19:45:34.153 回答