Do autor de pg-promise...
pg-promise não oferece suporte ao cancelamento de consulta, porque é um hack para contornar o design incorreto do banco de dados ou a execução incorreta da consulta.
O PostgreSQL suporta eventos que devem ser usados ao executar consultas demoradas, portanto, em vez de esperar, pode-se definir um ouvinte de eventos para ser acionado quando dados/visualizações específicos estiverem disponíveis. Veja o exemplo de ESCUTA/NOTIFY.
Você pode estender pg-promise com seu próprio método de consulta personalizado que expirará com uma rejeição (veja o exemplo abaixo), mas isso é novamente outra solução alternativa para um problema de design.
Exemplo usando 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 */);
Então você pode usar
db.queryTimeout(query, values, delay)
em todos os níveis. Alternativamente, se você estiver usando o Bluebird, você pode encadear
.timeout(delay)
para qualquer um dos métodos existentes:db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Veja também:
- estender evento
- Bluebird.timeout
ATUALIZAÇÃO
A partir da versão 8.5.3, o pg-promise começou a oferecer suporte a tempos limite de consulta, por meio da propriedade
query_timeout
dentro do objeto de conexão. Você pode substituir os padrões:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Ou especifique-o no objeto de conexão:
const db = pgp({
/* all connection details */
query_timeout: 3000
});