3

设置: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 因为我希望能够将消息发送回该用户。我意识到可以调用“下一个”并出现错误,我更关心来自其他库的其他异常。

4

2 回答 2

9

我意识到可以调用“下一个”并出现错误,我更关心来自其他库的其他异常。

我怀疑您对此感到担忧,因为您具有其他编程语言的背景(至少我的情况是这样)。最后,您不太可能在异步代码中看到异常,因为这不是 Node.js 中的约定,仍然有可能但不太可能。这是来自 Isaac Schlueter 本人:

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

于 2013-01-24T15:27:58.297 回答
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!');
  });
});
于 2013-01-24T01:46:20.517 回答