使用node-mongodb-native连接mongodb,连接自动关闭的问题!
发布于 9 年前 作者 xuguoliangjj 8888 次浏览 最后一次编辑是 8 年前 来自 问答

问题就是,我用node-mongodb-native连接上mongodb之后,默认打开了一个有五个连接的连接池,但是这5个连接在几分钟后自动就关闭了 这个是mongodb的配置文件 QQ图片20150617110114.png 这个是mongodb的log日志 QQ图片20150617110120.png

这个是我的base_mongodb.js文件

var MongoClient = require('mongodb').MongoClient
   , ObjectId = require('mongodb').ObjectID
   , assert = require('assert')
   , Util = require('./util')
   , db;
module.exports = function(){
   var self = this;

   this.findOneById = function(tableName,id,callback){
       connection(function (db) {
           db.collection(tableName,function(err,collection){
               var mongoId = ObjectId(id);
               var cursor = collection.find({'_id':mongoId});
               cursor.toArray(function(err,docs){
                   if(err){
                       callback(false);
                   }else{
                       callback(docs);
                   }
                   cursor.rewind();
               });
           });
       })
   };
   /**
    * 连接mongodb
    * @param callback
    */
   function connection(callback){
       if(!db){
           var dbConfig = Util.get('config.json','db');
           var host = dbConfig['host']
               , user = dbConfig['user']
               , password = dbConfig['password']
               , port = dbConfig['port']
               , db_name = dbConfig['db_name']
               , authSource = dbConfig['authSource'];
           var url = 'mongodb://'+user+':'+password+'@'+host+':'+port+'/'+db_name+'?authSource='+authSource;
           MongoClient.connect(url,function(err,dbObject){
               assert.equal(null,err);
               console.log('Connect to MongoDB success~');
               db = dbObject;
               callback(db);
           });
       }else{
           callback(db);
       }
   }
}

这个是我的http.js文件

var http=require('http')
    , BaseMongodb = require('./base_mongodb')
    , baseMongodb = new BaseMongodb();
http.createServer(function(req,res){
    res.writeHead(200,{"Content-type":"text/html;charset=utf-8"});
    switch (req.url)
    {
        case '/':
            baseMongodb.findOneById('node_booki','5574fc1055608daf0b789f38',function(ret){
                if(ret)
                    res.end(JSON.stringify(ret));
                else
                    res.end('222');
            });

            break;
    }
}).listen(3000);
console.log("浏览器打开http://127.0.0.1:3000");
24 回复

求大神解答~~

求大神解答~~

我不是大神,想问为啥不用mongoose?

@libook 为啥一定要用mongoose?

目测逻辑没问题,怀疑是某个api做了超时断线的逻辑。正在查找。

求大神解答~~

@xuguoliangjj 你的这个url拼接模型在哪里看到的? var url = ‘mongodb://’+user+’:’+password+’@’+host+’:’+port+’/’+db_name+’?authSource=’+authSource;

http://mongodb.github.io/node-mongodb-native/2.0/api/MongoClient.html官方的demo中url和用户名密码是分开的,而且authSource这个目前我也没有发现。你的驱动程序版本是多少?

@haozxuan 2.0.33 官方的是这样的

// Connection URL
var url = 'mongodb://dave:password@localhost:27017/myproject';

authSource是通过通过哪个集合来验证账号密码啊,我的账号密码是在admin里的,所以authSource=admin

@xuguoliangjj 恩,你的这种写法是“Indirectly Against Another Database”,你可以尝试不设置身份验证测试下,看是否会自动断线。因为我调查的结果是并没有相关api会自动断开。

重点看启动mongodb的 方式

@haozxuan 我去掉了身份验证,还是一样

@wldlzt 什么启动方式?/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb.conf我就是这么启动的,配置文件上面有图片

是不是keepAlive问题? socketOptions: {keepAlive: 1}
2.4版本后,不加keepAlive, 会出现意外链接断开.

@macross2005 加了keepAlive还是一样会断开,怎么回事啊

关注下这个问题~

找到问题了,如果我的脚本和MongoDB在同一台服务器上就不会有这种情况,但是如果本地的脚本去连服务器上的MongoDB就会出现上面的情况,有人知道原因吗?

估计通讯问题吧(平时真没在意过这个连接数的问题)。我推测的:如果有脚本连接连接池就会有连接数,关闭脚本运行,连接数就会下降。既然是远程通讯,那通讯中断是不是就相当于关闭脚本运行呢?如果你5分钟左右连接数降为0,那约3~4分钟重新运行一次脚本(比如刷新一下),如果连接数没降,那应该就是通讯问题了。

顶一下~~

是不是服务器把链接给干掉了,自己局域网内测试一下呢。

顶一下~~

@xuguoliangjj mongodb原生node驱动的官方文档中说,原生驱动的功能太简单,如果你想使用MVC思想直接操作模型对象来进行数据库操作的话,推荐使用mongoose。

//使用mongoose直接新建并操作user对象
let user = new User();
user.name='jack';
user.save();
user.gender='male';
user.save();

//换成原生驱动
let user = {"name": "", "gender": "", "password": ""};
user.name='jack';
db.collection('users').insert(user);
user.gender='male';
db.collection('users').update({"$set":user});

程序不一定完全对,自己掂量用哪种吧~

回到顶部