Visão geral
Ao usar o driver Node.js para executar uma operação de servidor , você também pode limitar a duração permitida para o servidor concluir a operação. Para fazer isso, especifique um tempo limite de operação do lado do cliente (CSOT) . O tempo limite se aplica a todas as etapas necessárias para concluir a operação, incluindo seleção do servidor , verificação da conexão e execução do lado do servidor. Quando o tempo limite expira, o driver Node.js gera uma exceção de tempo limite.
Observação
Recurso experimental
O recurso CSOT é experimental e pode mudar em futuras versões de drivers.
Opção timeoutMS
Para especificar um tempo limite ao se conectar a um sistema do MongoDB , defina a opção de conexão timeoutMS para o comprimento de tempo limite em milissegundos. Você pode fazer isso de duas maneiras: passando um argumento para o construtor MongoClient ou por meio de um parâmetro em sua string de conexão.
Os seguintes exemplos de código utilizam a opção timeoutMS para especificar um tempo limite de 30 segundos:
const uri = "mongodb://<hostname>:<port>"; const client = new MongoClient(uri, { timeoutMS: 30000 });
const uri = "mongodb://<hostname>:<port>?timeoutMS=30000"; const client = new MongoClient(uri);
Observação
A opção de conexão timeoutMS tem precedência sobre as seguintes opções:
socketTimeoutMSwaitQueueTimeoutMSwTimeoutMSmaxTimeMSmaxCommitTimeMS
Quando o recurso CSOT não for mais experimental, as opções anteriores serão descontinuadas.
Se você especificar a opção timeoutMS, o driver aplicará automaticamente o tempo limite especificado para cada operação do servidor . O exemplo de código a seguir especifica um tempo limite de 10 segundos no nível do cliente e, em seguida, chama o método insertOne():
const uri = "<connection string uri>"; const client = new MongoClient(uri, { timeoutMS: 10000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); const result = await coll.insertOne({ name: "Yngwie" }); console.log("Insert result:", result); } finally { await client.close(); } } run().catch(console.dir);
Herança de tempo limite
Quando você especifica uma opção timeoutMS, o driver aplica o tempo limite de acordo com os mesmos comportamentos de herança que as outras opções de driver Node.js A tabela a seguir descreve como o valor do tempo limite é herdado em cada nível:
Nível | Descrição da herança |
|---|---|
(operação) | Tem a maior precedência e substituirá |
transação | Tem precedência sobre |
Sessão | Aplica-se a todas as transações e operações dentro dessa sessão, a menos que a opção seja substituída por opções definidas nesses níveis. |
Database | Aplica-se a todas as sessões e operações desse banco de dados, a menos que a opção seja substituída pelas opções definidas nesses níveis. |
collection | Aplica-se a todas as sessões e operações dessa collection, a menos que a opção seja substituída por opções definidas nesses níveis. |
Cliente | Aplica-se a todos os bancos de dados, collections, sessões, transações e operações dentro desse cliente que não especificam de outra forma |
Para obter mais informações sobre substituições e opções específicas, consulte a seção Substituições .
Substitui
O driver Node.js oferece suporte a vários níveis de configuração para controlar o comportamento e o desempenho das operações do banco de dados .
Você pode especificar uma opção timeoutMS no nível de operação para substituir a configuração do cliente para uma operação específica. Isso permite que você personalize os tempos limite com base nas necessidades de queries individuais.
O exemplo seguinte demonstra como uma configuração de nível de operação timeoutMS pode substituir uma configuração de nível de cliente timeoutMS:
// Creates a new MongoClient with a client-level timeoutMS configuration const uri = "<connection string uri>"; const client = new MongoClient(uri, { // Client-level timeout: 15 seconds timeoutMS: 15000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); // Performs a query operation with an operation-level timeoutMS configuration const docs = await coll.find({}, // Operation-level timeout: 10 seconds { timeoutMS: 10000 }) .toArray(); console.log(docs); } finally { await client.close(); } } run().catch(console.dir);
Transações
Ao criar uma nova instância ClientSession para implementar uma transação, use a opção defaultTimeoutMS. Você pode configurar o defaultTimeoutMS para especificar os valores de timeoutMS para utilizar para:
Se você não especificar defaultTimeoutMS, o driver utilizará o valor de timeoutMS definido no MongoClient pai.
Não é possível substituir defaultTimeoutMS definindo a opção timeoutMS em uma operação em uma sessão de transação fornecida pela chamada de resposta withTransaction() . Isso gera um erro.
Criptografia do cliente
Quando você usa a criptografia no nível do campo do lado do cliente (CSFLE), o driver usa a opção timeoutMS para limitar o tempo permitido para operações de criptografia e descriptografia.
Se você especificar a opção timeoutMS ao construir uma instância do ClientEncryption, ela controlará o tempo de vida de todas as operações executadas nesta instância. Se você não fornecer timeoutMS, a instância herdará a configuração timeoutMS do MongoClient usado no construtor ClientEncryption.
Se você definir timeoutMS no cliente e diretamente em ClientEncryption, o valor fornecido para ClientEncryption terá precedência.
Cursors
Os cursores oferecem configurações de tempo limite configuráveis ao usar a funcionalidade CSOT. Você pode ajustar o manuseio do cursor configurando a vida útil do cursor ou o modo de iteração do cursor, se necessário. Para configurar o modo timeoutMode, defina a opção cursorLifetime, que é o padrão, ou iteration.
Modo de vida útil do cursor
O modo de vida útil do cursor usa timeoutMS para limitar toda a vida útil de um cursor. Neste modo, a inicialização do cursor e todas as chamadas subsequentes para os métodos do cursor devem ser concluídas dentro do limite especificado pela opção timeoutMS. Todos os documentos devem ser devolvidos dentro desse limite. Caso contrário, a vida útil do cursor expira e ocorre um erro de tempo limite.
Quando você fecha um cursor chamando o método toArray() ou close(), o tempo limite é redefinido para o comando killCursors para garantir que os recursos do lado do servidor sejam limpos.
O exemplo a seguir mostra como definir a opção timeoutMS para garantir que o cursor seja inicializado e todos os documentos sejam recuperados dentro de 10 segundos:
const docs = await collection.find({}, {timeoutMS: 10000}).toArray();
Modo de iteração do cursor
O modo de iteração do cursor usa a opção timeoutMS para limitar cada chamada ao método next(), hasNext() ou tryNext(). O tempo limite é atualizado após a conclusão de cada chamada. Esse é o modo padrão para todos os cursores tailable, como os cursores tailable retornados pelo método find() em capped collections ou change streams.
O exemplo de código a seguir itera sobre documentos na coleção mflix usando um cursor com o timeoutMode definido como iteration e, em seguida, obtém e registra o imdb_url para cada documento de filme:
for await (const movie of mflix.find({}, { timeoutMode: 'iteration' })) { const imdbResponse = await fetch(movie.imdb_url); console.log(await imdbResponse.text()); }
Documentação da API
Para saber mais sobre como usar tempos limite com o driver Node.js , consulte a seguinte documentação da API: