Od autora pg-promise...
pg-promise nie obsługuje anulowania zapytań, ponieważ jest to hack do obejścia nieprawidłowego projektu bazy danych lub złego wykonania zapytania.
PostgreSQL obsługuje zdarzenia, które powinny być używane podczas wykonywania czasochłonnych zapytań, więc zamiast czekać, można ustawić detektor zdarzeń, który ma być wyzwalany, gdy określone dane/widok staną się dostępne. Zobacz przykład SŁUCHAJ/POWIADAJ.
Możesz rozszerzyć pg-promise o własną niestandardową metodę zapytania, która przekroczy limit czasu z odrzuceniem (patrz przykład poniżej), ale jest to kolejne obejście problemu z projektem.
Przykład przy użyciu 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 */);
Następnie możesz użyć db.queryTimeout(query, values, delay)
na każdym poziomie.
Alternatywnie, jeśli używasz Bluebird, możesz połączyć .timeout(delay)
do dowolnej z istniejących metod:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Zobacz też:
- przedłuż wydarzenie
- Bluebird.timeout
AKTUALIZUJ
Od wersji 8.5.3 pg-promise zaczął obsługiwać limity czasu zapytań za pośrednictwem właściwości query_timeout
w obiekcie połączenia.
Możesz zmienić ustawienia domyślne:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Lub określ go w obiekcie połączenia:
const db = pgp({
/* all connection details */
query_timeout: 3000
});