Dari penulis pg-promise...
pg-promise tidak mendukung pembatalan kueri, karena ini adalah peretasan untuk mengatasi desain basis data yang salah atau eksekusi kueri yang buruk.
PostgreSQL mendukung acara yang harus digunakan saat menjalankan kueri yang memakan waktu, jadi alih-alih menunggu, seseorang dapat mengatur pendengar acara untuk dipicu saat data/tampilan tertentu tersedia. Lihat contoh DENGARKAN/BERITAHU.
Anda dapat memperluas pg-promise dengan metode kueri kustom Anda sendiri yang akan habis waktu dengan penolakan (lihat contoh di bawah), tapi itu sekali lagi solusi lain di atas masalah desain.
Contoh menggunakan 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 */);
Kemudian Anda dapat menggunakan db.queryTimeout(query, values, delay)
pada setiap tingkat.
Atau, jika Anda menggunakan Bluebird, Anda dapat membuat rantai .timeout(delay)
ke salah satu metode yang ada:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Lihat juga:
- perpanjang acara
- Bluebird.timeout
PERBARUI
Dari versi 8.5.3, pg-promise mulai mendukung waktu tunggu kueri, melalui properti query_timeout
dalam objek koneksi.
Anda dapat mengganti default:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Atau tentukan dalam objek koneksi:
const db = pgp({
/* all connection details */
query_timeout: 3000
});