node.js - pg-promise 中的查询超时

标签 node.js postgresql pg-promise

我想为 pg-promise 查询添加超时,这样如果数据库尚未响应,它们将在一段时间后失败。 有没有推荐的方法来做到这一点,或者我应该制作自定义包装器来处理计时器并在为时已晚时拒绝 promise ?

最佳答案

来自 pg-promise 的作者...


pg-promise不支持查询取消,因为它是一种解决不正确的数据库设计或错误的查询执行的技巧。

PostgreSQL 支持在执行耗时查询时应使用的事件,因此无需等待,您可以设置一个事件监听器,以便在特定数据/ View 可用时触发。参见 LISTEN/NOTIFY示例。

您可以扩展 pg-promise使用您自己的自定义查询方法,该方法会因拒绝而超时(参见下面的示例),但这又是另一种解决设计问题的方法。

示例使用 Bluebird :

const Promise = require('bluebird');

Promise.config({
    cancellation: true
});


const initOptions = {
    promiseLib: Promise,
    extend(obj) {
        obj.queryTimeout = (query, values, delay) => {
            return obj.any(query, values).timeout(delay);
        }
    }
};

const pgp = require('pg-promise')(initOptions);
const db = pgp(/* connection details */);

然后您可以在每个级别上使用 db.queryTimeout(query, values, delay)

或者,如果您使用 Bluebird ,您可以将 .timeout(delay) 链接到任何现有方法:

db.any(query, values)
    .timeout(500)
    .then(data => {})
    .catch(error => {})

另见:

更新

来自版本8.5.3 , pg-promise通过连接对象中的属性 query_timeout 开始支持查询超时。

您可以覆盖默认值:

pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds

或者在连接对象中指定:

const db = pgp({
    /* all connection details */

    query_timeout: 3000
});

关于node.js - pg-promise 中的查询超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46160177/

相关文章:

postgresql - 无法在 Google Cloud SQL 上创建 postgis 扩展

postgresql - Yii 与 PostGis,选择经度和纬度

pg-promise 和行级安全性

javascript - 我可以在 node.js 中使用 http.ServerResponse 作为原型(prototype)吗?

javascript - Express 4 命名空间参数?

PostgreSQL:如何使用 'execute' 设置变量值?

javascript - 使用 Node.js 从其他文件调用方法

node.js - 如何替换 ObjectId 引用。与来自 MongoDB 的实际对象一起使用(最好在服务器端)?

node.js - 使用 npm-shrinkwrap.json 进行 npm-update

node.js - 使用 json 数组在 Postgresql 中进行参数化查询