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

Característica experimental

La función CSOT es experimental y podría cambiar en futuras versiones de controladores.

Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, configure el timeoutMS Opción de conexión para la duración del tiempo de espera en milisegundos. Puede hacerlo de dos maneras: pasando un argumento al constructor 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 función CSOT ya no sea experimental, las opciones anteriores quedarán obsoletas.

Si especifica la opción timeoutMS, el controlador aplica 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);

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

Nivel
Descripción de la 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 anulada 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 de esa colección, a menos que la opción sea anulada por las opciones establecidas en esos niveles.

Cliente

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

Para obtener más información sobre anulaciones y opciones específicas, consulte la Secciónde anulaciones.

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.

Puede 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 le permite personalizar los tiempos de espera según las necesidades de cada consulta.

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);

Al crear una nueva instancia ClientSession para implementar una transacción, utilice la opción defaultTimeoutMS. Puede configurar defaultTimeoutMS para especificar los valores timeoutMS que se usarán para:

Si no especifica defaultTimeoutMS, el controlador utiliza el valor timeoutMS establecido en el 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 configura timeoutMS tanto en el cliente como directamente en ClientEncryption, el valor proporcionado a ClientEncryption tendrá prioridad.

Los cursores ofrecen opciones de tiempo de espera configurables al usar la función CSOT. Puede ajustar el manejo del cursor configurando su duración o el modo de iteración, si es necesario. Para configurar el modo, establezca la opción timeoutMode en cursorLifetime (el valor predeterminado) o en iteration.

El modo de duración del cursor usa timeoutMS para limitar la duración total de un cursor. En este modo, la inicialización del cursor y todas las llamadas subsiguientes a sus métodos deben completarse dentro del límite especificado por la opción timeoutMS. Todos los documentos deben devolverse dentro de este límite. De lo contrario, la duración del cursor expira y se produce un error de tiempo de espera.

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

El siguiente ejemplo muestra cómo configurar la opción timeoutMS para garantizar que el cursor se inicialice y todos los documentos se recuperen en 10 segundos:

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

El modo de iteración del cursor utiliza la opción timeoutMS para limitar cada llamada al método next(), hasNext() o tryNext(). El tiempo de espera se actualiza tras cada llamada. Este es el modo predeterminado para todos los cursores adaptables, como los cursores adaptables devueltos por el método find() en colecciones limitadas o flujos de cambios.

El siguiente ejemplo de código itera sobre los documentos de la colección mflix utilizando un cursor con timeoutMode establecido en iteration y luego obtiene y registra imdb_url para 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