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.