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

2 回复

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

解释

  1. 自动重连 (auto_reconnect):

    • 在连接字符串中添加 auto_reconnect=true 参数,这样当连接断开时,MongoDB 客户端会自动尝试重新建立连接。
  2. 异步处理:

    • 使用 db.collection('users') 方法获取集合引用,然后调用 collection.findOne 方法查询数据。

通过以上修改,你的 Node.js 应用程序应该能够更好地处理连接断开的情况,并且能够在 BAE 上稳定运行。如果仍然遇到问题,建议检查 BAE 的网络配置以及 MongoDB 服务的可用性。

回到顶部