pg-promiseの作者から...
pg-promiseは、誤ったデータベース設計や不適切なクエリ実行を回避するためのハックであるため、クエリのキャンセルをサポートしていません。
PostgreSQLは、時間のかかるクエリを実行するときに使用する必要があるイベントをサポートしているため、待機する代わりに、特定のデータ/ビューが使用可能になったときにトリガーされるようにイベントリスナーを設定できます。 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 => {})
参照:
- イベントの延長
- Bluebird.timeout
更新
バージョン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
});