2016-02-23 3 views
3

Когда я пытаюсь нажать слишком большие объемы данных в mongoDb я получаю эту ошибку: MongoError: document is larger than the maximum size 16777216Mongoose: как поймать MongoError вызванного асинхронным обратного вызова

Я знаю, это нормально, но я не могу поймать этот ошибка, и мои node.js выходы процесса.

Можете ли вы сказать мне, как поймать эту ошибку?

example.js: не может обнаружить ошибку, node процесс выходит

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 

mongoose.connection.on('error', function (err) { 
    console.log(err); 
}); 

var Cat = mongoose.model('Cat', {name: Object}); 


setTimeout(function() { 
    var kitty = new Cat({ 
     name: { 
      value: 'Zildjian', 
      data: (new Array(16 * 1024 * 1024)).join("x") 
     } 
    }); 

    kitty.save(function (err) { 
     if (err) // ... 
      console.log('meow'); 
    }); 

}, 1000); 

Я пытался обернуть свой код в try...catch но не поймал ошибку либо.

+0

@downvoter, пожалуйста скажите мне, почему это downwote. Я мог бы научиться этому, если бы вы сказали мне, в чем проблема с вопросом. – Adam

ответ

1

Поскольку setTimeout является асинхронным и поставить обратный вызов стека внешнего вызова обеспечивает ошибку подняться до вершины стеки. Так что не»использовать setTimeout, или вы можете добавить дополнительный обработчик ошибок:

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 

mongoose.connection.on('error', function (err) { 
    console.log(err); 
}); 

process.on('uncaughtException', function (err) { 
    if (err.name==='MongoError') { 
    mongoose.connection.emit('error', err); 
    } else { 
    console.log(err); 
    process.exit(0); 
    } 
}); 

var Cat = mongoose.model('Cat', {name: Object}); 


setTimeout(function() { 
    var kitty = new Cat({ 
     name: { 
      value: 'Zildjian', 
      data: (new Array(16 * 1024 * 1024)).join("x") 
     } 
    }); 

    kitty.save(function (err) { 
     if (err) // ... 
      console.log('meow'); 
    }); 

}, 1000); 
+0

Почему я могу поймать другие типы ошибок? Если я изменил тип 'name' на' String' в определении 'mongoose.model ('Cat', {name: String})' и удалил из него огромные данные: 'data: {}', я получите '[ValidationError: Cat validation failed]' и он пойман. Почему validationError можно поймать, но maxSize нет? – Adam

+0

Поскольку Mongoose по-разному обрабатывает ошибки: ошибка проверки обрабатывается функцией обратного вызова (см. 'Mongoose/lib/error/validation.js'), но ошибка с размером документа возникает через' throw' (см. 'Mongodb/lib/навалом/unordered.js'). –

+1

Это хороший ответ, но сама проблема была в mongodb, которая исправлена ​​здесь: https://github.com/mongodb/node-mongodb-native/commit/06fd4db11d7d1b312136b63cd70ba4ce3a720023 – Adam

-1

Вам нужно подождать, пока соединение будет установлено. Подождите, пока «открыто» событие:

mongoose.connection.once('open', function() { 
    // Your code goes here      
}); 

Как указано здесь: https://gist.github.com/mongolab-org/9959376

+0

Вы попробовали это? Я пробовал и не работал. – Adam

+0

Действительно извините, просто ответил из памяти. Исправлен мой ответ, –

+0

Было ясно, что вы сказали, но это все еще не решило проблему. Вы попробовали? – Adam