Nodejs BAE3.0 mongoose 长连接问题

Nodejs BAE3.0 mongoose 长连接问题

怎么用 mongoose 链接BAE的数据库

贴出部分代码

config.js

var config = {
 username:"4qakk7pmG5tkyl1mne6eS04n",
 password:"Oek6K2RpwPUoi0a2Obk0sAPDV0tBLUyi",
 db_host:"mongo.duapp.com",
 db_name:"zJIdwZIQgNwTSKddFmqM",
 db_port:"8908"
}

var localhost = { username:"", password:"", db_host:“localhost”, db_name:“express-mongoose-demo”, db_port:“27011” }

module.exports = config;

db.js

var mongoose = require('mongoose');
var config = require('../config');

var db = exports.Db = mongoose.createConnection();
var options = {
    db: { native_parser: true },
    server: { poolSize: 5 },
    user: config.username,
    pass: config.password
}
db.open(config.db_host, config.db_name, config.db_port, options);

//监听BAE mongodb异常后关闭闲置连接
db.on('error', function (err) {
   db.close();
});

//监听db close event并重新连接
db.on('close', function () {
    db.open(config.db_host, config.db_name, config.db_port, options);
});

怎么调用


8 回复

Nodejs BAE3.0 Mongoose 长连接问题

问题描述

在使用 mongoose 连接到百度云应用引擎(BAE)的 MongoDB 数据库时,遇到了长连接的问题。具体表现为数据库连接不稳定或频繁断开。

解决方案

为了确保与 BAE 的 MongoDB 数据库保持稳定的长连接,可以采取以下措施:

  1. 配置 Mongoose 连接参数:通过设置适当的连接参数来优化连接池的管理。
  2. 错误处理:在连接发生错误或关闭时进行相应的处理。

以下是具体的实现步骤和代码示例:

1. 配置文件 config.js

var config = {
    username: "4qakk7pmG5tkyl1mne6eS04n",
    password: "Oek6K2RpwPUoi0a2Obk0sAPDV0tBLUyi",
    db_host: "mongo.duapp.com",
    db_name: "zJIdwZIQgNwTSKddFmqM",
    db_port: "8908"
};

module.exports = config;

2. 数据库连接文件 db.js

var mongoose = require('mongoose');
var config = require('./config');

var db = mongoose.createConnection(`mongodb://${config.username}:${config.password}@${config.db_host}:${config.db_port}/${config.db_name}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    useFindAndModify: false,
    poolSize: 5 // 设置连接池大小
});

// 监听错误事件
db.on('error', function (err) {
    console.error('MongoDB connection error:', err);
});

// 监听连接关闭事件
db.on('close', function () {
    console.log('MongoDB connection closed. Attempting to reconnect...');
    db.openUri(`mongodb://${config.username}:${config.password}@${config.db_host}:${config.db_port}/${config.db_name}`, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,
        useFindAndModify: false,
        poolSize: 5
    });
});

// 导出 db 对象
module.exports = db;

3. 调用示例

在其他模块中,你可以通过引入 db.js 文件来访问数据库连接:

var db = require('./db');

// 定义一个简单的模型
var Schema = db.Schema;
var UserSchema = new Schema({
    name: String,
    age: Number
});

var User = db.model('User', UserSchema);

// 插入数据
var newUser = new User({ name: 'John Doe', age: 30 });
newUser.save(function (err, user) {
    if (err) return console.error(err);
    console.log(user);
});

// 查询数据
User.find({}, function (err, users) {
    if (err) return console.error(err);
    console.log(users);
});

总结

通过以上配置,可以确保 mongoose 在连接 BAE 的 MongoDB 数据库时更加稳定。关键在于合理设置连接参数和处理连接状态变化。


遇到同样问题。

已解决~

这个connection创建完以后是Mongoose的Default connection吗?

可以贴出解决方法吗?

你好,可以贴出解决方案吗?

方法就是上面的代码~

针对你的需求,以下是如何使用 Mongoose 连接到 BAE 3.0 的 MongoDB 数据库,并处理长连接问题。以下是改进后的 db.js 文件代码示例:

var mongoose = require('mongoose');
var config = require('./config');

// 使用 mongoose.connect 方法替代 createConnection 和 open 方法,以更好地处理连接
mongoose.connect(`mongodb://${config.username}:${config.password}@${config.db_host}:${config.db_port}/${config.db_name}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    server: { poolSize: 5 }
}).then(() => {
    console.log('Connected to MongoDB successfully.');
}).catch(err => {
    console.error('Failed to connect to MongoDB:', err);
});

// 监听错误事件,并尝试重新连接
mongoose.connection.on('error', function (err) {
    console.error('MongoDB connection error:', err);
    // 尝试重新连接
    mongoose.connect(`mongodb://${config.username}:${config.password}@${config.db_host}:${config.db_port}/${config.db_name}`, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        server: { poolSize: 5 }
    });
});

// 监听关闭事件,并尝试重新连接
mongoose.connection.on('close', function () {
    console.error('MongoDB connection closed, attempting to reconnect...');
    mongoose.connect(`mongodb://${config.username}:${config.password}@${config.db_host}:${config.db_port}/${config.db_name}`, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        server: { poolSize: 5 }
    });
});

解释:

  1. mongoose.connect 方法替代了 createConnectionopen 方法,这使得连接管理和错误处理更加方便。
  2. 使用 useNewUrlParseruseUnifiedTopology 是为了防止潜在的解析 URL 或拓扑变化时出现的警告。
  3. errorclose 事件上,我们尝试重新连接到数据库,确保应用程序保持活跃状态。

这样可以有效解决由于网络波动或其他原因导致的连接断开问题。

回到顶部