2

This is the error I get: [Error: db object already connecting, open cannot be called multiple times]. I have a global mongo object in this vows test.

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

When I try to open it the second time I get this error.

So even though I'm using db.close() the first time it doesn't seem to close. Is there another way of re-using the connection?

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

1 Answer 1

2

Just like most things in node, db.close is asynchronous and accepts a callback. You'll need to pass the callback or promisify it and return a promise. Your next connect call should only be done when you're positive the db connection has closed, and you'll only know that by handling the callback.

db.close(function (err) {
  if (err) return console.error('OH NOES, AN ERROR:', err);
  console.log('SUCCESS!');
  // db is now closed, do whatevs
});
Sign up to request clarification or add additional context in comments.

2 Comments

Extra plus if you add some code too :) Though I eventually solved it by adding another batch. As batches in vows are handled sequentially.
I assumed you'd know how to use a callback. Here's your close function signature if you're using the native mongodb driver. Looks like it even emits a close event in there. That's probably exposed on the db object if needed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.