Nodejs bae关于连接mongodb的问题

Nodejs bae关于连接mongodb的问题

连接代码:

function connection(){
   mongoose.connect("mongodb://" + username + ":" + password +"@"+ host + ":" + port + "/" + db);//需要验证账户
   var db = mongoose.connection;
   var options = { user: username, pass: password};
    db.on('error',function callback() {
    	console.error.bind(console,'connection error数据库连接失败');
        // console.log("connect close retry connect……");
        db.open(host, db, port, options);
        // console.log("connected");
    });
    
    db.once('open',function callback(){
        console.log('connection success数据库连接成功');
    });   
}

bae的mongodb不支持长连接,不到一分钟就会断开,所以我想当断开的时候再次连接就行。目前是可以重新连接的,但是还是会报错,不知道是不是参数传错了,错误如下:

at EventEmitter.emit (events.js:106:17)
at null.<anonymous> (/home/bae/app/.bae/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:568:14)
at Server.Base._emitAcrossAllDbInstances (/home/bae/app/.bae/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js:504:17)
at emit (/home/bae/app/.bae/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js:254:19)
at Db.EventEmitter.emit (events.js:98:17)
at Db.<anonymous> (/home/bae/app/.bae/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:147:10)
at NativeConnection.EventEmitter.emit (events.js:95:17)
at NativeConnection.callback (/home/bae/app/models/connection.js:25:12)
at NativeConnection.Connection.open (/home/bae/app/.bae/node_modules/mongoose/lib/connection.js:212:10)
at NativeConnection.Connection.error (/home/bae/app/.bae/node_modules/mongoose/lib/connection.js:388:24)
TypeError: string is not a function
^
if (callback) return callback(err);
/home/bae/app/.bae/node_modules/mongoose/lib/connection.js:388

5 回复

Nodejs bae关于连接mongodb的问题

在使用Node.js连接Baidu BAE(BAE)上的MongoDB时,遇到一些问题,特别是由于BDE的MongoDB不支持长连接,导致连接会在不到一分钟内断开。因此,我们需要实现一个自动重连机制来确保应用能够持续与数据库保持连接。

连接代码

首先,我们定义一个connection函数来初始化Mongoose连接,并处理连接错误和成功事件:

const mongoose = require('mongoose');

function connection(username, password, host, port, db) {
    mongoose.connect(`mongodb://${username}:${password}@${host}:${port}/${db}`, {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });

    const db = mongoose.connection;

    db.on('error', function (err) {
        console.error('connection error: ' + err.message);
        setTimeout(() => {
            console.log('Attempting to reconnect...');
            connection(username, password, host, port, db);
        }, 5000);  // 5秒后尝试重新连接
    });

    db.once('open', function () {
        console.log('Connected to MongoDB successfully');
    });
}

// 调用连接函数
connection('yourUsername', 'yourPassword', 'yourHost', yourPort, 'yourDatabaseName');

解释

  1. Mongoose连接配置:

    • mongoose.connect()方法用于建立与MongoDB的连接。
    • useNewUrlParseruseUnifiedTopology 是为了兼容最新的Mongoose版本,并避免警告信息。
  2. 错误处理:

    • db.on('error', ...) 监听连接错误。如果发生错误,控制台将打印错误信息,并在5秒后调用connection函数尝试重新连接。
  3. 成功连接:

    • db.once('open', ...) 在连接成功时触发,控制台将打印成功消息。

错误分析

你提到的错误TypeError: string is not a function可能是因为你在错误处理中错误地调用了db.open方法。db.open方法实际上是MongoDB驱动程序中的方法,而不是Mongoose的一部分。正确的做法是在错误事件中重新调用connection函数来尝试重新连接。

通过上述修改,你的应用应该能够在连接断开时自动尝试重新连接,从而避免因短连接导致的应用中断。


看来没人解决过bae的相关问题,后来我一想,这种断开重连的方式也不科学,总不能是程序与数据库一直保持连接吧, 这样必定消耗数据库资源,不够明智。或许可以在需要数据库操作时再连接。不过当前有点不明白的地方是:session用的是Mongodb,需不需要一直连接数据库?

session只不过是将会话的信息存到mongodb中,当你使用时才用到数据库,不适用就不用啊 :)

问题已完美解决

根据你提供的代码和描述,问题出在错误处理和重新连接的方式上。db.open() 并不是正确的重新连接方法,而且你在 db.on('error') 回调中使用了错误的方法来处理错误。以下是改进后的示例代码:

const mongoose = require('mongoose');

let db;

function connect() {
    mongoose.connect(`mongodb://${username}:${password}@${host}:${port}/${db}`, { useNewUrlParser: true, useUnifiedTopology: true });

    db = mongoose.connection;

    db.on('error', (err) => {
        console.error('Connection error:', err.message);
        setTimeout(connect, 5000); // 5秒后尝试重新连接
    });

    db.once('open', () => {
        console.log('Connected to MongoDB');
    });
}

// 初始化连接
connect();

解释:

  1. 错误处理:在 db.on('error') 中,我们直接传递错误对象到回调函数中,以便更好地理解错误信息。
  2. 重新连接:使用 setTimeout(connect, 5000) 在发生错误时延迟5秒后重试连接。这样可以避免立即重试可能带来的问题。
  3. 连接配置:添加了 useNewUrlParseruseUnifiedTopology 配置项以确保兼容性和安全性。

这段代码应该能解决你的连接问题,并且在断开连接时自动尝试重新连接。

回到顶部