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了再新开一个,现在已经解决啦,希望遇到这个问题的盆友少走弯路!参考地址


4 回复

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);
});

代码解释

  1. 设置连接参数:定义了数据库连接所需的参数,包括主机名、数据库名称、端口号、用户名和密码。

  2. 创建连接:使用mongoose.createConnection()创建一个新的连接实例。

  3. 监听事件

    • 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();

解释

  1. 连接选项:使用 useNewUrlParseruseUnifiedTopology 来避免潜在的解析错误。
  2. 连接字符串:在连接字符串中包含用户名和密码,以确保身份验证成功。
  3. 重试机制:在连接失败时,使用 setTimeout 在5秒后重新尝试连接。
  4. 监听错误和关闭事件:当连接出错或关闭时,输出日志并尝试重新连接。

这样可以保证即使连接被意外关闭或出现临时性错误,程序也能自动重连,提高系统的稳定性和可靠性。

回到顶部