创建http服务器时刷新两次,Mongodb连接就不可用了 - CNode技术社区

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

这是我连接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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /