Od autora pg-promise...
pg-promise nepodporuje zrušení dotazu, protože je to hack, jak obejít nesprávný návrh databáze nebo špatné provedení dotazu.
PostgreSQL podporuje události, které by se měly používat při provádění časově náročných dotazů, takže místo čekání lze nastavit, aby se posluchač událostí spustil, když budou k dispozici konkrétní data/pohled. Viz příklad LISTEN/NOTIFY.
Můžete rozšířit pg-promise o svou vlastní metodu dotazu, která vyprší s odmítnutím (viz příklad níže), ale to je opět další řešení vedle problému s návrhem.
Příklad použití 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 */);
Pak můžete použít db.queryTimeout(query, values, delay)
na každé úrovni.
Alternativně, pokud používáte Bluebird, můžete řetězit .timeout(delay)
na kteroukoli ze stávajících metod:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Viz také:
- prodloužit událost
- Bluebird.timeout
AKTUALIZACE
Od verze 8.5.3 začal pg-promise podporovat časové limity dotazů prostřednictvím vlastnosti query_timeout
v objektu připojení.
Výchozí hodnoty můžete buď přepsat:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Nebo jej zadejte v objektu připojení:
const db = pgp({
/* all connection details */
query_timeout: 3000
});