2013-08-20 4 views
-1

Рассматривая приведенный ниже код, как возможно, что блок try/catch захватывает «Ошибка маршрута»? Я понимаю, что обратный вызов, зарегистрированный на маршруте '/', выполняется в цикле основного события и, таким образом, исключение не может быть захвачено указанным блоком try/catch, потому что он не является частью стека вызовов, где выполняется обратный вызов.Экспресс, поток управления ошибкой узла

var express = require('express') ; 
var app = express(); 
var http = require('http'); 

var mongod = require('mongodb'); 

var server_conf = new mongod.Server('localhost', 27017, {auto_reconnect:true}); 

//dummy logger 
var logger = { 
    error:function(message, object) {console.log('anything')}, 
    log:function(message, object) {console.log('anything')}, 
    debug:function(message, object) {console.log('anything')}} 

var db_container = {db: new mongod.Db('test', server_conf, 
    {w:1, 
     journal:true, native_parser:true, logger: logger})} 

app.use(express.bodyParser()); 
app.use(app.router); 

db_container.db.open(function(err, index_info){ 

    if(err) throw err; 
    var testcol = db_container.db.collection('testcol'); 
    try{ 
     app.get('/', function(request, res){ 
      throw new Error("Route Error"); 
      testcol.insert({hello:"moto"}, function(err,doc){ 

       if(err){ 
        throw err; 
       } 
       testcol.find({}).toArray(function(err,docs){ 
        res.send(docs); 
       }); 
      }); 

     }); 
    } 
    catch(e){ 
     res.send("err caught "+ e); 
    } 
    http.createServer(app).listen(3000, function() { 
     console.log('Express server listening on port ' + '3000'); 
    }); 
}); 

Связанный с этим вопрос, почему следующая ошибка «Ошибка» не сбивает приложение с узлом. В конце концов, функция, в которой эта ошибка возникает, работает в цикле основного события и должна приводить к неперехваченному исключению, таким образом, сбой приложения, если это не так? Если родной драйвер Монго ловит ошибку и спокойно поправив его ...

var express = require('express') ; 
var app = express(); 
var http = require('http'); 

var mongod = require('mongodb'); 

var server_conf = new mongod.Server('localhost', 27017, {auto_reconnect:true}); 

//dummy logger 
var logger = { 
    error:function(message, object) {console.log('anything')}, 
    log:function(message, object) {console.log('anything')}, 
    debug:function(message, object) {console.log('anything')}} 

var db_container = {db: new mongod.Db('test', server_conf, 
    {w:1, 
     journal:true, native_parser:true, logger: logger})} 

app.use(express.bodyParser()); 
app.use(app.router); 

db_container.db.open(function(err, index_info){ 

    if(err) throw err; 
    var testcol = db_container.db.collection('testcol'); 
    try{ 
     app.get('/', function(request, res){ 

      testcol.insert({hello:"moto"}, function(err,doc){ 
       throw new Error("Crash Me"); 

       if(err){ 
        throw err; 
       } 
       testcol.find({}).toArray(function(err,docs){ 
        res.send(docs); 
       }); 
      }); 

     }); 
    } 
    catch(e){ 
     res.send("err caught "+ e); 
    } 
    http.createServer(app).listen(3000, function() { 
     console.log('Express server listening on port ' + '3000'); 
    }); 
}); 

ответ

0

Ответ на первую часть вопроса не here

Что касается второй части, то вопрос остается открытым, но я полагаю, что это связано с некоторой попыткой уловить в node-mongodb-native, тихонько отталкивая выброшенное исключение.

Вы можете найти любые связанные ответы в группе-node-mongodb-native here