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

Wil*_*ver 3 mongoose node.js express

设置: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);
Run Code Online (Sandbox Code Playgroud)

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

在这里抛出异常:

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

正如预期的那样,clientErrorHandler捕获异常.相反,扔在这里:

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

然后,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 
      });
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

也没有被快递抓住.

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

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

Hec*_*rea 9

我意识到可以用错误调用'next',我更关心来自其他库的其他异常.

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

"节点中的模式是同步方法抛出,异步方法将错误作为回调的第一个参数传递.如果回调的第一个参数是假的(通常为null或未定义),那么一切都与世界相符." https://groups.google.com/d/msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ