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 数据库保持稳定的长连接,可以采取以下措施:
- 配置 Mongoose 连接参数:通过设置适当的连接参数来优化连接池的管理。
- 错误处理:在连接发生错误或关闭时进行相应的处理。
以下是具体的实现步骤和代码示例:
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 }
});
});
解释:
- mongoose.connect 方法替代了
createConnection
和open
方法,这使得连接管理和错误处理更加方便。 - 使用
useNewUrlParser
和useUnifiedTopology
是为了防止潜在的解析 URL 或拓扑变化时出现的警告。 - 在
error
和close
事件上,我们尝试重新连接到数据库,确保应用程序保持活跃状态。
这样可以有效解决由于网络波动或其他原因导致的连接断开问题。