Van de auteur van pg-promise...
pg-promise ondersteunt het annuleren van zoekopdrachten niet, omdat het een hack is om een onjuist databaseontwerp of een slechte uitvoering van zoekopdrachten te omzeilen.
PostgreSQL ondersteunt gebeurtenissen die moeten worden gebruikt bij het uitvoeren van tijdrovende zoekopdrachten, dus in plaats van te wachten, kan men een gebeurtenislistener instellen die wordt geactiveerd wanneer specifieke gegevens/weergaven beschikbaar komen. Zie voorbeeld LISTEN/NOTIFY.
Je kunt pg-promise uitbreiden met je eigen aangepaste querymethode die een time-out krijgt met een afwijzing (zie voorbeeld hieronder), maar dat is weer een andere oplossing bovenop een ontwerpprobleem.
Voorbeeld met 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 */);
Dan kunt u db.queryTimeout(query, values, delay)
. gebruiken op elk niveau.
Als alternatief, als je Bluebird gebruikt, kun je .timeout(delay)
. koppelen naar een van de bestaande methoden:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Zie ook:
- evenement verlengen
- Bluebird.timeout
UPDATE
Vanaf versie 8.5.3 is pg-promise begonnen met het ondersteunen van query-time-outs, via eigenschap query_timeout
binnen het verbindingsobject.
U kunt de standaardinstellingen overschrijven:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Of specificeer het binnen het verbindingsobject:
const db = pgp({
/* all connection details */
query_timeout: 3000
});