我可以获得快速错误处理程序来捕获在mongoose回调中抛出的异常吗?

时间:2013-01-24 01:36:52

标签: node.js express mongoose

设置:nodejs,express,mongodb,mongoose

相关代码:

var express = require('express');
var server = express();
server.use(express.bodyParser());
server.use(express.methodOverride());
server.use(server.router);

var mongoose = require('mongoose');
mongoose.connect('localhost', 'test');
var Schema = mongoose.Schema;
var VehicleSchema = new Schema({
    name : String
}, {collection: 'vehicles'});
var Vehicle = mongoose.model('vehicle', VehicleSchema);

server.use(clientErrorHandler);
function clientErrorHandler(err, req, res, next) {
    console.log('client error handler found', err);
    res.send(500, err);
}

server.get('/api/test', function(req, res, next){
    Vehicle.find().exec(function(err, rows){
        res.send(rows);
    });
});

server.listen(1981);

这将按预期返回一个空数组。

在这里抛出异常:

server.get('/api/test', function(req, res, next){
    throw 'my exception';// <------------------------ here
    Vehicle.find().exec(function(err, rows){
        res.send(rows);
    });
});

正如预期的那样,clientErrorHandler捕获异常。相反,把它扔到这里:

server.get('/api/test', function(req, res, next){        
    Vehicle.find().exec(function(err, rows){
        throw 'my exception';// <------------------------ here
        res.send(rows);
    });
});

异常不会被clientErrorHandler捕获,而是被mongoose / lib / util.js捕获并重新抛出

exports.tick = function tick (callback) {
  if ('function' !== typeof callback) return;
  return function () {
    try {
      callback.apply(this, arguments);
    } catch (err) {
      // only nextTick on err to get out of
      // the event loop and avoid state corruption.
      process.nextTick(function () {
        throw err; //<--------------------------------- here 
      });
    }
  }
}

做一些没有猫鼬的事情,例如:

server.get('/api/test', function(req, res, next){
    process.nextTick(function(){
        throw 'here';
    });
});

也没有被快递抓住。

如何避免被猫鼬而不是快递抓住?我怎样才能表达以发现错误?我可以获得快递以捕获单独的勾号上的错误吗? (这是我应该报告的内容吗?)

我想避免使用process.error,因为我希望能够将消息发送回该用户。我意识到可以用错误调用'next',我更关心来自其他库的其他异常。

2 个答案:

答案 0 :(得分:9)

  

我意识到可以用错误调用'next',我更关心   关于来自其他图书馆的其他例外情况。

我怀疑你关心这个,因为你使用其他编程语言的背景(至少这是我的情况。)最后,你不太可能在异步代码中看到异常,因为这不是Node.js中的约定,它仍然可能但不太可能。这是来自Isaac Schlueter本人:

  

“节点中的模式是同步方法抛出和异步方法   将错误作为第一个参数传递给回调。如果是第一个   回调的参数是falsey(通常为null或undefined),然后   一切都与世隔绝。“   https://groups.google.com/d/msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ

答案 1 :(得分:4)

您应该使用next回调返回错误,而不是抛出异常,然后由应用的错误处理程序处理。

如果您正在调用可能抛出自己错误的函数,请将它们包装在try子句中,并使用catch中捕获的错误调用回调。这是一个例子:

server.get('/api/test', function (req, res, next) {
  process.nextTick(function () {
    try {
      functionWhichWillThrowAnError();
    } catch (error) {
      next(error);
      return;
    }
    res.send('everything is okay!');
  });
});