有猫鼬连接错误回调


74

如果猫鼬无法连接到数据库,如何设置错误处理的回调?

我知道

connection.on('open', function () { ... });

但是有什么类似的东西

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


5
对于在此问题上绊脚石的任何人,connection.on('error', function (err) { ... });现在都可以在3.X中实现。
Nepoxx

Answers:


118

连接后,您可以在回调中获取错误:

mongoose.connect('mongodb://localhost/dbname', function(err) {
    if (err) throw err;
});

1
如果我希望服务器即使出现错误也能继续运行怎么办?到目前为止,我尝试过的所有操作都会引发错误,然后终止程序。
winduptoy

2
@evilcelery猫鼬中的所有查询都已缓冲,因此所有这些查询都应在重新连接到db后立即执行,这很好,并且不应引起未知状态。
pronebird

9
这似乎不起作用。我可以给它提供一个错误的uri,而err总是返回undefined。
Morgan Herlocker

1
错误来自于connect()mongoosejs.com/docs/connections.html的Mongoose文档,该文档未指定可能的回调。
mikemaccana

2
这在较新的Mongoose版本(3.X)中不起作用。请参阅Asta的答案以获取有效的解决方案。
Nepoxx

41

您可以使用许多猫鼬回调,

// CONNECTION EVENTS
// When successfully connected
mongoose.connection.on('connected', function () {  
  console.log('Mongoose default connection open to ' + dbURI);
}); 

// If the connection throws an error
mongoose.connection.on('error',function (err) {  
  console.log('Mongoose default connection error: ' + err);
}); 

// When the connection is disconnected
mongoose.connection.on('disconnected', function () {  
  console.log('Mongoose default connection disconnected'); 
});

// If the Node process ends, close the Mongoose connection 
process.on('SIGINT', function() {  
  mongoose.connection.close(function () { 
    console.log('Mongoose default connection disconnected through app termination'); 
    process.exit(0); 
  }); 
}); 

有关更多信息:http : //theholmesoffice.com/mongoose-connection-best-practice/


2
on错误回调不再提供该错误。这只是一个布尔值,表示true。
阿米塔瓦·莫祖德

21

万一发生任何事情,我正在运行的Mongoose版本(3.4)可以按照问题中的说明进行操作。因此以下内容可能会返回错误。

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

1
即使这样也不行!err的值只是“ true”。没有实际错误的描述。
阿米塔瓦·莫祖玛

@amitavamozumder检查我有关如何使用catch和try / catch方法处理错误的答案。
valdeci,

6

正如我们在错误处理的猫鼬文档中所看到的那样,由于connect()方法返回Promise,所以promisecatch是用于猫鼬连接的选项。

因此,要处理初始连接错误,应将.catch()try/catch与配合使用async/await

这样,我们有两个选择:

使用.catch()方法:

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true })
.catch(error => console.error(error));

或使用try / catch:

try {
    await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
} catch (error) {
    console.error(error);
}

恕我直言,我认为使用catch是一种更清洁的方法。


如果连接不好,我会UnhandledPromiseRejectionWarning: ReferenceError: handleError is not defined
serraosays

@staypuftman handleError是一个泛型方法,它根本不存在。我更新了我的问题以明确说明。
valdeci

明白了,愚蠢的错误对我而言。这只是一个通用名称catch()-感谢您的澄清
-serraosays

1
@valdeci谢谢,在猫鼬官方文档中也提到了这一点。仍然在这里,我正在寻找堆栈溢出相同的解决方案。我觉得这是一个最好的,到目前为止
乔尔·约瑟夫

2

较晚的答案,但是如果要保持服务器运行,可以使用以下命令:

mongoose.connect('mongodb://localhost/dbname',function(err) {
    if (err)
        return console.error(err);
});

0
  • 处理(捕获)连接异常
  • 处理其他连接错误
  • 成功连接时显示一条消息
mongoose.connect(
  "mongodb://..."
).catch((e) => {
  console.log("error connecting to mongoose!");
});
mongoose.connection.on("error", (e) => {
  console.log("mongo connect error!");
});
mongoose.connection.on("connected", () => {
  console.log("connected to mongo");
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.