一尘不染

pg-promise中的查询超时

node.js

我想将超时添加到pg-
promise查询,以便如果数据库尚未响应,则在一段时间后它们将失败。有什么建议的方法吗?还是我应该做一个可以处理定时器并拒绝诺言的自定义包装器(如果为时已晚)?


阅读 323

收藏
2020-07-07

共1个答案

一尘不染

来自pg-promise的作者…


pg-promise不支持查询取消,因为它可以解决数据库设计错误或查询执行不正确的问题。

PostgreSQL支持在执行耗时的查询时应使用的事件,因此无需等待,可以将事件侦听器设置为在特定数据/视图可用时触发。请参阅“
侦听/提示”示例。

您可以使用自己的自定义查询方法扩展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
});
2020-07-07