MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Manipulando tempos limite com Node.js e mongodb


UPD:
Com base neste post, parece que eles implantaram uma correção que fará o mesmo que fazemos aqui. Não tenho certeza se isso já está dentro do npm (15.10.13). https://github.com/mongodb/node -mongodb-native/issues/1092#ref-commit-2667d13

Após algumas investigações consegui entender o que está acontecendo lá:
Toda vez que você chama qualquer método para lidar com banco de dados (localizar, atualizar, inserir, etc.) ele cria um cursor, que tem ID próprio e se registra para EventEmitter de Db para ser chamado de volta mais tarde. Enquanto isso, ele se registra no objeto _notReplied dentro do mesmo CallBackStore.

Mas uma vez que a conexão é fechada, não consegui localizar nada que iterasse através dos cursores _notReplied e os acionasse com erros ou qualquer lógica com temporizadores (ainda pode estar em algum lugar). Então eu consegui escrever um pequeno trabalho em torno, que força os cursores acionadores com erro quando o banco de dados emite close evento:
new mongodb.Db('testdb', new mongodb.Server('localhost', 27017, { }), { safe: true }).open(function (err, db) {
  if (!err) {
    db.on('close', function() {
      if (this._callBackStore) {
        for(var key in this._callBackStore._notReplied) {
          this._callHandler(key, null, 'Connection Closed!');
        }
      }
    });

    // ...

  } else {
    console.log(err)
  }
});

Eu recomendo usar a primeira abordagem em vez do MongoClient. Os motivos são poucos:por exemplo, quando você fecha a conexão e chama .find ele acionará corretamente o erro no retorno de chamada, enquanto com o MongoClient não.

Se você estiver usando o MongoClient:
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
  if (!err) {
    db.on('close', function() {
      if (this._callBackStore) {
        for(var key in this._callBackStore._notReplied) {
          this._callHandler(key, null, 'Connection Closed!');
        }
      }
    });

    // ...

  } else {
    console.log(err);
  }
});

O que isso vai fazer? Uma vez que a conexão é fechada, ela irá percorrer todos os cursores _notReplied e acionar eventos para eles com o erro Connection Closed! .

Caso de teste:
items.find({ }).toArray(function(err, data) {
  if (!err) {
    console.log('Items found successfully');
  } else {
    console.log(err);
  }
});
db.close();

Isso forçará o fechamento da conexão com o banco de dados e acionará close evento que você manipula anteriormente e garantirá que o cursor seja fechado.

UPD:adicionei um problema no GitHub:https://github.com /mongodb/node-mongodb-native/issues/1092 vamos ver o que eles dizem sobre isso.