创建http服务器时刷新两次,Mongodb连接就不可用了
发布于 9 年前 作者 xuguoliangjj 4361 次浏览 最后一次编辑是 8 年前 来自 问答

这是我连接mongodb的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文件,index.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");

为什么我http://127.0.0.1:3000刷新两次的时候第二次总是查询不了数据库然后卡住,第一次就可以~~为啥?

8 回复

没人回答嘛~~~

没人回答嘛~~~

if(!db){

这里的问题

然后 db.close()

你在第一次查询结束的时候,db 连接关闭了,第二次拿这个db去查询,就会一直等待。。

@jerrywu55 我是想不要每次都查询,然后关闭,然后下次重新连接,这样子效率太低了,我是想连接后在连接有效期内可以重用,等连接失效后我才重新去连接

@zhangking520 默认是有连接池啊,但是连接池超时后,如何重新连接?

按我的理解 db赋值后的值 是一个对象,就算调用了close方法 !db还是为false 你可以参考generic-pool 的实现,或者直接使用mongoose

回到顶部