重用节点中的MongoDB连接

这是我得到的错误: [Error: db object already connecting, open cannot be called multiple times] 。 我在这个誓言testing中有一个全球性的mongo对象。

 mongo = new mongo.Db(config.api.apiTest, new mongo.Server('localhost', 27017, {}), {native_parser: off, safe: true}) 

当我第二次尝试打开它时出现此错误。

所以即使我第一次使用db.close()它似乎并不closures。 有没有其他方式重新使用连接?

 .addBatch( "Redis - ": "Standard account - ": topic: -> # . redisClient.del "#{ accountId }:900" mongo.open (error, db) => secondDb = db.db config.api.accountTest secondDb.collection 'accounts', (error, accountsColl) => accountsColl.update {'accountId': ObjectID(accountId)}, { "$unset": {'permission': ''}}, (error, records) => console.log "Unset? " + records db.close() db.close() inventory = nock('http://inventory.honshuu.vgrnt:80') .get("/devices/?accountId=#{ accountId }&userId=#{ userId }") .reply(200, 'OK') httpRequest.get 'http://127.0.0.1:18091/inventory/devices/?token=testtoken', @callback return "Ratelimit is applied correctly": (error, response, body) -> accountLimit = response.headers['x-ratelimit-limit'] assert.equal response.headers['x-ratelimit-remaining'], 240-1 assert.equal response.headers['x-ratelimit-reset'], 900 "account": topic: -> # Need to fetch permission in db. # redisClient.del "permission-#{ accountId }", (error, result) => # console.log "removes" # console.log result inventory = nock('http://inventory.honshuu.vgrnt:80') .get("/devices/?accountId=#{ accountId }&userId=#{ userId }") .reply(200, 'OK') mongo.open (error, db) => secondDb = db.db config.api.accountTest console.log secondDb secondDb.collection 'accounts', (error, accountsColl) => accountsColl.update {'accountId': ObjectID(accountId)}, { 'permission': 1000}, (error, records) => console.log "updated? " + records httpRequest.get 'http://127.0.0.1:18091/inventory/devices/?token=testtoken', @callback return return "account has more rate tokens": (error, response, body) -> console.log response console.log error # accountLimit = response.headers['x-ratelimit-limit'] # assert.equal response.headers['x-ratelimit-remaining'], 1000-1 # assert.equal response.headers['x-ratelimit-reset'], 900 # assert.equal response.headers['x-ratelimit-limit'], 1000 ) 

       

网上收集的解决方案 "重用节点中的MongoDB连接"

就像节点中的大部分事物一样, db.close是asynchronous的并且接受一个callback。 你需要通过callback或promisify它,并返回一个承诺。 你的下一个连接调用应该只在db连接closures的情况下才能完成,而你只能通过处理callback来知道。

 db.close(function (err) { if (err) return console.error('OH NOES, AN ERROR:', err); console.log('SUCCESS!'); // db is now closed, do whatevs });