猫鼬:如何捕获由异步回调引起的MongoError

Mongoose: how to catch MongoError caused by async callback

本文关键字:MongoError 回调 异步 何捕获 猫鼬      更新时间:2023-09-26

当我尝试将太大的数据推送到mongoDb时,出现此错误:MongoError: document is larger than the maximum size 16777216

我知道,这是正常的,但是我无法捕获此错误,并且我的node.js进程退出。

你能告诉我,如何捕获此错误吗?

示例.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但这也没有发现错误。

因为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);

您需要等待连接启动。等待"打开"事件:

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

如下所述:https://gist.github.com/mongolab-org/9959376