乐闻世界logo
搜索文章和话题

How do I set a timeout on a Mongoose query?

6 个月前提问
5 个月前修改
浏览次数45

1个答案

1

在使用 Mongoose(一个Node.js的MongoDB对象模型工具)进行数据库查询时,有时候可能会想要设置查询的超时时间,特别是在面对可能长时间运行或高负载的查询时。设置超时时间可以帮助避免数据库操作过长时间占用资源,同时也可以提高应用程序的响应速度和稳定性。

在Mongoose中,设置查询的超时时间可以通过几种方式来实现:

1. 使用maxTimeMS()方法

maxTimeMS() 是 Mongoose 查询的一个方法,它允许你为查询指定一个最大执行时间(以毫秒为单位)。如果查询执行时间超过了这个限制,MongoDB 会尝试终止执行该查询。这是一种在查询级别设置超时的方法。

javascript
const mongoose = require('mongoose'); const User = mongoose.model('User', new mongoose.Schema({ name: String })); async function findUser() { try { const result = await User.find({ name: 'Alice' }) .maxTimeMS(100) // 设置最大执行时间为100毫秒 .exec(); console.log(result); } catch (error) { console.error('查询超时或其他错误', error); } } findUser();

2. 使用连接字符串选项

在创建数据库连接时,你也可以在连接字符串中设置socketTimeoutMSconnectTimeoutMS。这些设置会影响所有通过这个连接发起的操作。

  • socketTimeoutMS:这个选项设置了除了连接以外的所有MongoDB操作的超时时间。
  • connectTimeoutMS:这个选项设置了尝试连接MongoDB时的超时时间。
javascript
const mongoose = require('mongoose'); const connectionString = 'mongodb://localhost:27017/mydatabase?socketTimeoutMS=1000&connectTimeoutMS=1000'; // 设置超时时间为1000毫秒 mongoose.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('数据库连接成功')) .catch(err => console.error('数据库连接失败', err)); // 通过这个连接进行的所有操作都将具有这些超时设置

3. 使用Query的options属性

可以直接在查询的options属性中设置maxTimeMS,这跟使用maxTimeMS()方法类似,但是是以不同的形式来设置。

javascript
const result = await User.find({}).setOptions({ maxTimeMS: 100 }).exec();

以上方法可以帮助你在使用 Mongoose 进行数据库操作时管理和控制查询的超时时间,从而提高应用程序的性能和用户体验。

2024年6月29日 12:07 回复

你的答案