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

A topologia foi destruída ao usar o MongoDB com driver nativo e Express.js


Isso ocorre porque o código contém um antipadrão:toda vez que uma nova solicitação chega, ele abre uma nova conexão com o banco de dados e, em seguida, fecha essa conexão assim que a resposta é enviada. Em seguida, ele tentou reutilizar a conexão fechada, daí a mensagem de erro que você está vendo na segunda solicitação.

O que você deseja é conectar-se apenas uma vez ao banco de dados durante o tempo de vida do aplicativo usando um objeto de conexão global e, em seguida, usar esse objeto global para executar suas operações de banco de dados.

O uso desse objeto global permite que o driver MongoDB crie corretamente um pool de conexão com o banco de dados. Esse pool é gerenciado pelo driver MongoDB e evita o caro padrão de conexão/reconexão.

Por exemplo:
// listen on this port
const port = 3000

// global database client object
var client = null

// listen on the configured port once database connection is established
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, res) => {
  assert.equal(null, err)
  client = res
  app.listen(port, () => console.log(`Example app listening on port ${port}!`))
})

// use the client global object for database operations
app.get('/', (req, res) => {
  db = req.query.db
  col = req.query.col
  client.db(db).collection(col).find({}).toArray((err, docs) => {
    assert.equal(null, err)
    res.send(JSON.stringify(docs))
  })
})

Editar respondendo sua pergunta no comentário:

Isso ocorre porque no código original, dbClient foi globalmente definido. Quando dbClient.close() foi chamado, o dbClient global foi fechado. Um erro foi produzido quando esse dbClient objeto foi reutilizado. Isso ocorre porque connect() cria um pool de conexões em vez de uma única conexão e não era esperado que fosse chamado várias vezes por chamada.

Se você mover o dbClient variável do escopo global para o app.get() contexto, você descobrirá que nenhum erro será produzido ao chamar o endpoint HTTP várias vezes, como um novo dbClient objeto foi criado todas as vezes.

Dito isto, embora funcione, este não é um padrão recomendado. É melhor usar um padrão semelhante ao código de exemplo que postei acima.