Dall'autore di pg-promise...
pg-promise non supporta l'annullamento delle query, perché è un trucco per aggirare la progettazione errata del database o l'esecuzione errata della query.
PostgreSQL supporta gli eventi che dovrebbero essere utilizzati durante l'esecuzione di query che richiedono tempo, quindi invece di attendere, è possibile impostare un listener di eventi da attivare quando diventano disponibili dati/viste specifici. Vedi esempio ASCOLTA/NOTIFICA.
Puoi estendere pg-promise con il tuo metodo di query personalizzato che scadrà con un rifiuto (vedi esempio di seguito), ma questa è ancora un'altra soluzione per risolvere un problema di progettazione.
Esempio utilizzando 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 */);
Quindi puoi utilizzare db.queryTimeout(query, values, delay)
ad ogni livello.
In alternativa, se stai usando Bluebird, puoi concatenare .timeout(delay)
a uno qualsiasi dei metodi esistenti:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Vedi anche:
- estendere l'evento
- Bluebird.timeout
AGGIORNAMENTO
Dalla versione 8.5.3, pg-promise ha iniziato a supportare i timeout delle query, tramite la proprietà query_timeout
all'interno dell'oggetto connessione.
Puoi ignorare le impostazioni predefinite:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Oppure specificalo all'interno dell'oggetto connessione:
const db = pgp({
/* all connection details */
query_timeout: 3000
});