【问题标题】:Reusing MongoDB connection in node在节点中重用 MongoDB 连接
【发布时间】:2015-06-04 17:30:11
【问题描述】:

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

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

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

所以即使我第一次使用db.close(),它似乎也没有关闭。是否有其他方法可以重用连接?

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

【问题讨论】:

    标签: node.js mongodb vows


    【解决方案1】:

    就像节点中的大多数东西一样,db.close 是异步的并接受回调。您需要传递回调或对其进行承诺并返回一个承诺。只有当您确定数据库连接已关闭时,您的下一次连接调用才应该完成,并且您只能通过处理回调知道这一点。

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

    【讨论】:

    • 如果您也添加一些代码,则额外加分 :) 尽管我最终通过添加另一批解决了它。由于誓言中的批次是按顺序处理的。
    • 我假设你知道如何使用回调。 Here's 如果您使用的是本机 mongodb 驱动程序,则您的关闭函数签名。看起来它甚至会在其中发出 close 事件。如果需要,这可能会在 db 对象上公开。
    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多