Nodejs程序部署到BAE后报错Error: no open connections,用了mogonskin
Nodejs程序部署到BAE后报错Error: no open connections,用了mogonskin
程序本地测试一切正常,部署到BAE后,用着用着,就报错Error: no open connections,
数据库链接文件db.js
var config = require('../config.js'),
mongo = require('mongoskin');
var db = mongo.db(config.user+’:’+config.pwd+’@’+config.host+’:’+config.port+’/’+config.db,{safe:true})
module.exports = db;
userModel
var mongo = require('./db.js');
userClass.getOne = function(user,cb) {
mongo.collection('users').findOne(user,function (err,re) {
cb(err,re);
});
};
auto_reconnect=true后正常
var db = mongo.db(config.user+':'+config.pwd+'@'+config.host+':'+config.port+'/'+config.db+'?auto_reconnect=true',{safe:true})
Nodejs程序部署到BAE后报错Error: no open connections,用了mogonskin
问题描述
我在本地测试时,Node.js程序运行一切正常。但是将程序部署到百度应用引擎(BAE)后,程序偶尔会报错 Error: no open connections
。这个问题主要出现在使用了 mongoskin
进行数据库连接的情况下。
数据库链接文件 (db.js
)
var config = require('../config.js'),
mongo = require('mongoskin');
var db = mongo.db(config.user+':'+config.pwd+'@'+config.host+':'+config.port+'/'+config.db,{safe:true})
module.exports = db;
用户模型文件 (userModel.js
)
var mongo = require('./db.js');
userClass.getOne = function(user, cb) {
mongo.collection('users').findOne(user, function (err, re) {
cb(err, re);
});
};
解决方案
出现 Error: no open connections
的原因通常是由于数据库连接池管理不当或网络不稳定导致的。为了解决这个问题,可以在数据库连接字符串中添加 auto_reconnect=true
参数,这样当连接断开时,mongoskin
会自动尝试重新连接。
修改后的数据库链接文件 (db.js
) 如下:
var config = require('../config.js'),
mongo = require('mongoskin');
var db = mongo.db(
config.user + ':' + config.pwd + '@' + config.host + ':' + config.port + '/' + config.db + '?auto_reconnect=true',
{ safe: true }
);
module.exports = db;
示例代码
以下是完整的修改后的代码示例:
配置文件 (config.js
)
module.exports = {
user: 'your_username',
pwd: 'your_password',
host: 'your_host',
port: 'your_port',
db: 'your_database'
};
数据库链接文件 (db.js
)
var config = require('../config.js'),
mongo = require('mongoskin');
var db = mongo.db(
config.user + ':' + config.pwd + '@' + config.host + ':' + config.port + '/' + config.db + '?auto_reconnect=true',
{ safe: true }
);
module.exports = db;
用户模型文件 (userModel.js
)
var mongo = require('./db.js');
userClass.getOne = function(user, cb) {
mongo.collection('users').findOne(user, function (err, re) {
cb(err, re);
});
};
通过添加 auto_reconnect=true
参数,可以确保在连接断开时自动重新建立连接,从而避免 Error: no open connections
错误的发生。
根据你提供的信息,问题在于 Node.js 程序在 BAE(百度应用引擎)上运行时,MongoDB 连接池可能会耗尽。为了解决这个问题,你可以启用 MongoDB 的自动重连功能。
示例代码
db.js
var config = require('../config.js');
var mongo = require('mongoskin');
// 添加 auto_reconnect 参数
var db = mongo.db(
`${config.user}:${config.pwd}@${config.host}:${config.port}/${config.db}?auto_reconnect=true`,
{ safe: true }
);
module.exports = db;
userModel
var db = require('./db.js');
userClass.getOne = function(user, cb) {
var collection = db.collection('users');
collection.findOne(user, function(err, result) {
cb(err, result);
});
};
解释
-
自动重连 (
auto_reconnect
):- 在连接字符串中添加
auto_reconnect=true
参数,这样当连接断开时,MongoDB 客户端会自动尝试重新建立连接。
- 在连接字符串中添加
-
异步处理:
- 使用
db.collection('users')
方法获取集合引用,然后调用collection.findOne
方法查询数据。
- 使用
通过以上修改,你的 Node.js 应用程序应该能够更好地处理连接断开的情况,并且能够在 BAE 上稳定运行。如果仍然遇到问题,建议检查 BAE 的网络配置以及 MongoDB 服务的可用性。