Från författaren till pg-promise...
pg-promise stöder inte avbrytning av sökfrågor, eftersom det är ett hack för att komma runt felaktig databasdesign eller dålig exekvering av sökfrågor.
PostgreSQL stöder händelser som bör användas vid exekvering av tidskrävande frågor, så istället för att vänta kan man ställa in en händelseavlyssnare som ska triggas när specifik data/vy blir tillgänglig. Se LYSSNA/NOTIFIERA exempel.
Du kan utöka pg-promise med din egen anpassade frågemetod som får timeout med ett avslag (se exempel nedan), men det är återigen en annan lösning på ett designproblem.
Exempel med 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 */);
Sedan kan du använda db.queryTimeout(query, values, delay)
på varje nivå.
Alternativt, om du använder Bluebird, kan du koppla .timeout(delay)
till någon av de befintliga metoderna:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Se även:
- förläng evenemanget
- Bluebird.timeout
UPPDATERA
Från version 8.5.3 började pg-promise stödja frågetimeout, via egenskapen query_timeout
inom anslutningsobjektet.
Du kan antingen åsidosätta standardinställningarna:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Eller ange det i anslutningsobjektet:
const db = pgp({
/* all connection details */
query_timeout: 3000
});