Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Limite el tiempo de ejecución del servidor

Al usar el controlador de Node.js para realizar una operación en el servidor, también puede limitar el tiempo que tarda el servidor en finalizarla. Para ello, especifique un tiempo de espera para la operación del lado del cliente (CSOT). Este tiempo de espera se aplica a todos los pasos necesarios para completar la operación, incluyendo la selección del servidor, la verificación de la conexión y la ejecución del lado del servidor. Cuando se agota el tiempo de espera, el controlador de Node.js genera una excepción de tiempo de espera.

Nota

Funcionalidad Experimental

La funcionalidad CSOT es experimental y podría cambiar en futuras versiones de driver.

Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, configure el timeoutMS opción de conexión a la duración del tiempo de espera en milisegundos. Se puede hacer de dos maneras: pasando un argumento al constructor de MongoClient o mediante un parámetro en la cadena de conexión.

Los siguientes ejemplos de código utilizan la opción timeoutMS para especificar un tiempo de espera 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);

Nota

La opción de conexión timeoutMS tiene prioridad sobre las siguientes opciones:

  • socketTimeoutMS

  • waitQueueTimeoutMS

  • wTimeoutMS

  • maxTimeMS

  • maxCommitTimeMS

Cuando la funcionalidad CSOT deje de ser experimental, las opciones anteriores quedarán obsoletas.

Si especifica la opción timeoutMS, el controlador aplicará automáticamente el tiempo de espera especificado en cada operación del servidor. El siguiente ejemplo de código especifica un tiempo de espera de 10 segundos a nivel de cliente y luego llama al 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);

Cuando especificas una opción timeoutMS, el controlador aplica el tiempo de espera según los mismos comportamientos de herencia que las otras opciones del controlador de Node.js. La siguiente tabla describe cómo se hereda el valor del tiempo de espera en cada nivel:

Nivel
Descripción de herencia

Operación

Tiene la máxima prioridad y anulará las timeoutMS opciones establecidas en cualquier otro nivel.

transacción

Tiene prioridad sobre timeoutMS establecido en el nivel de sesión, colección, base de datos o cliente.

sesión

Se aplica a todas las transacciones y operaciones dentro de esa sesión, a menos que la opción sea sobrescrita por las opciones establecidas en esos niveles.

Database

Se aplica a todas las sesiones y operaciones dentro de esa base de datos, a menos que la opción sea anulada por las opciones establecidas en esos niveles.

Colección

Se aplica a todas las sesiones y operaciones en esa colección, a menos que la opción se anule mediante opciones establecidas en esos niveles.

Cliente

Se aplica a todas las bases de datos, recopilaciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen de otra manera timeoutMS.

Para obtener más información sobre las anulaciónes y las opciones específicas, consulta el Sección Substituciones.

El controlador Node.js admite varios niveles de configuración para controlar el comportamiento y el rendimiento de las operaciones de la base de datos.

Puedes especificar una opción timeoutMS a nivel de operación para anular la configuración a nivel de cliente para una operación específica. Esto te permite personalizar los tiempos de espera según las necesidades de cada query individual.

El siguiente ejemplo demuestra cómo una configuración de nivel de operación timeoutMS puede anular una configuración de nivel 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);

Cuando cree una nueva instancia de ClientSession para implementar una transacción, utilice la opción defaultTimeoutMS. Puedes establecer defaultTimeoutMS para especificar los valores de timeoutMS que se utilizarán para:

Si no se especifica defaultTimeoutMS, el controlador utiliza el valor timeoutMS establecido en el elemento padre MongoClient.

No puedes sobrescribir defaultTimeoutMS configurando la opción timeoutMS en una operación dentro de una sesión de transacción proporcionada por la función de retorno withTransaction(). Al hacerlo, se lanza un error.

Cuando se utiliza el cifrado a nivel de campo del lado del cliente (CSFLE), el controlador utiliza la opción timeoutMS para limitar el tiempo permitido para las operaciones de cifrado y descifrado.

Si especifica la opción timeoutMS al construir una instancia ClientEncryption, esta controla la duración de todas las operaciones realizadas en ella. Si no proporciona timeoutMS, la instancia hereda la configuración timeoutMS de la opción MongoClient utilizada en el constructor ClientEncryption.

Si configuras timeoutMS en el cliente y directamente en ClientEncryption, el valor proporcionado a ClientEncryption tiene prioridad.

Los cursores ofrecen ajustes configurables de tiempo de espera a utilizar la funcionalidad CSOT. Puedes ajustar el manejo del cursor configurando el tiempo de vida del cursor o el modo de iteración del cursor si es necesario. Para configurar el modo, establece la opción timeoutMode en cursorLifetime, que es por defecto, o iteration.

El modo de duración del cursor utiliza timeoutMS para limitar toda la vida útil de un cursor. En este modo, la inicialización del cursor y todas las llamadas posteriores a los métodos del cursor deben completarse dentro del límite especificado por la opción timeoutMS. Todos los documentos deben ser devueltos dentro de este plazo. De lo contrario, el período de vida del cursor expira y ocurre un error de tiempo de espera.

Cuando cierras un cursor llamando al método toArray() o close(), el tiempo de espera se restablece para el comando killCursors para garantizar que los recursos del servidor se limpien.

El siguiente ejemplo muestra cómo configurar la opción timeoutMS para garantizar que el cursor esté inicializado y que todos los documentos se recuperen dentro de 10 segundos:

const docs = await collection.find({}, {timeoutMS: 10000}).toArray();

El modo de iteración del cursor usa la opción timeoutMS para limitar cada llamada al método next(), hasNext(), o tryNext(). El tiempo de espera se actualiza después de que se complete cada llamada. Este es el modo por defecto para todos los cursores con seguimiento, como los cursores con seguimiento que devuelve el método find() sobre colecciones con tamaño fijo o flujos de cambios.

El siguiente ejemplo de código itera sobre los documentos en la colección mflix utilizando un cursor con el timeoutMode configurado en iteration, y luego obtiene y registra el imdb_url de cada documento de película:

for await (const movie of mflix.find({}, { timeoutMode: 'iteration' })) {
const imdbResponse = await fetch(movie.imdb_url);
console.log(await imdbResponse.text());
}

Para obtener más información sobre el uso de tiempos de espera con el controlador Node.js, consulte la siguiente documentación de API:

Volver

Stable API

En esta página