Nodejs BAE上连接rockmongo报错:connection error: [Error: failed to connect to [mongo.duapp.com:8908]]及解决
Nodejs BAE上连接rockmongo报错:connection error: [Error: failed to connect to [mongo.duapp.com:8908]]及解决
如题,各位有遇到过这种情况吗?一开始是连接正常的,connect连接后有打出日志来,但是过一会就报错了,用的是mongoose,代码如下:
var db = mongoose.createConnection(),
options = {
db: { native_parser: true },
server: { poolSize: 5 },
user: settings.user,
pass: settings.pass
};
db.open(settings.host, settings.db, settings.port, options, function() {
console.log('mongoDB connected!');
});
db.on('error', function (err) {
console.error.bind(console, 'connection error:');
//listen BAE mongodb,if except throws then close the connection
//why have to do this?Clause it'll be disconnected if it free after 30s by BAE
db.close();
});
//when close, reopen a connect
db.on('close', function() {
db.open(settings.host, settings.db, settings.port, options);
});
这样写connect相当于是你给我断了,我就把原来的close了再新开一个,现在已经解决啦,希望遇到这个问题的盆友少走弯路!参考地址
Nodejs BAE上连接rockmongo报错:connection error: [Error: failed to connect to [mongo.duapp.com:8908]]及解决
问题描述
如题所述,在BAE(百度应用引擎)上使用Node.js连接RockMongo时遇到了connection error: [Error: failed to connect to [mongo.duapp.com:8908]]
的错误。起初连接正常,并且能够打印出日志信息,但一段时间后就会出现连接错误。使用的库是Mongoose。
解决方案
根据问题描述,连接在一段时间后会自动断开。为了解决这个问题,我们可以尝试在连接断开时重新建立连接。以下是修改后的代码示例:
var mongoose = require('mongoose');
// 设置数据库连接参数
var settings = {
host: 'mongo.duapp.com',
db: 'your_database_name',
port: 8908,
user: 'your_username',
pass: 'your_password'
};
var db = mongoose.createConnection();
var options = {
db: { native_parser: true },
server: { poolSize: 5 }
};
db.on('open', function () {
console.log('MongoDB connected!');
});
db.on('error', function (err) {
console.error('connection error:', err);
// 重连逻辑
setTimeout(function () {
db.open(settings.host, settings.db, settings.port, options, function (err) {
if (err) {
console.error('Reconnection failed:', err);
} else {
console.log('Reconnected successfully!');
}
});
}, 5000); // 5秒后尝试重新连接
});
db.on('close', function () {
console.log('Database connection closed. Attempting to reconnect...');
db.open(settings.host, settings.db, settings.port, options);
});
代码解释
-
设置连接参数:定义了数据库连接所需的参数,包括主机名、数据库名称、端口号、用户名和密码。
-
创建连接:使用
mongoose.createConnection()
创建一个新的连接实例。 -
监听事件:
on('open')
:当连接成功打开时触发。on('error')
:当发生连接错误时触发。这里添加了一个重连逻辑,通过setTimeout
在5秒后尝试重新连接。on('close')
:当连接关闭时触发,尝试重新建立连接。
通过这种方式,即使连接断开,也可以自动重新建立连接,从而避免长时间无法访问数据库的问题。希望这个解决方案能帮助遇到类似问题的朋友减少不必要的困扰。
这样是可以实现重连,但是感觉要好几分钟才能重新连接,不知你有没有这样的感觉和现象
根据你提供的信息,错误提示表明连接 mongo.duapp.com:8908
失败。这种问题通常与网络连接、超时设置或身份验证有关。以下是修改后的代码,包括对连接重试机制的改进。
修改后的代码
const mongoose = require('mongoose');
const settings = {
host: 'mongo.duapp.com',
db: 'yourDatabaseName',
port: 8908,
user: 'yourUsername',
pass: 'yourPassword'
};
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
user: settings.user,
pass: settings.pass,
server: { poolSize: 5 }
};
function connectToMongo() {
mongoose.connect(`mongodb://${settings.user}:${encodeURIComponent(settings.pass)}@${settings.host}:${settings.port}/${settings.db}`, options)
.then(() => console.log('mongoDB connected!'))
.catch(err => {
console.error('connection error:', err.message);
setTimeout(connectToMongo, 5000); // 5秒后重试连接
});
}
// 监听错误事件
mongoose.connection.on('error', (err) => {
console.error('connection error:', err.message);
});
// 监听关闭事件
mongoose.connection.on('close', () => {
console.log('mongoDB connection closed. Reconnecting...');
connectToMongo();
});
// 初始连接尝试
connectToMongo();
解释
- 连接选项:使用
useNewUrlParser
和useUnifiedTopology
来避免潜在的解析错误。 - 连接字符串:在连接字符串中包含用户名和密码,以确保身份验证成功。
- 重试机制:在连接失败时,使用
setTimeout
在5秒后重新尝试连接。 - 监听错误和关闭事件:当连接出错或关闭时,输出日志并尝试重新连接。
这样可以保证即使连接被意外关闭或出现临时性错误,程序也能自动重连,提高系统的稳定性和可靠性。