Từ tác giả của pg-promise ...
pg-promise không hỗ trợ hủy truy vấn, bởi vì việc xử lý thiết kế cơ sở dữ liệu không chính xác hoặc thực thi truy vấn không tốt là một sự tấn công.
PostgreSQL hỗ trợ các sự kiện nên được sử dụng khi thực hiện các truy vấn tốn thời gian, vì vậy thay vì chờ đợi, người ta có thể đặt trình xử lý sự kiện được kích hoạt khi có dữ liệu / chế độ xem cụ thể. Xem ví dụ LISTEN / NOTIFY.
Bạn có thể mở rộng pg-promise bằng phương pháp truy vấn tùy chỉnh của riêng mình, phương pháp này sẽ hết thời gian với một từ chối (xem ví dụ bên dưới), nhưng đó lại là một công việc khác liên quan đến vấn đề thiết kế.
Ví dụ sử dụng 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 */);
Sau đó, bạn có thể sử dụng db.queryTimeout(query, values, delay)
trên mọi cấp độ.
Ngoài ra, nếu bạn đang sử dụng Bluebird, bạn có thể chuỗi .timeout(delay)
đối với bất kỳ phương pháp hiện có nào:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Xem thêm:
- kéo dài sự kiện
- Bluebird.timeout
CẬP NHẬT
Từ phiên bản 8.5.3, pg-promise bắt đầu hỗ trợ hết thời gian chờ truy vấn, thông qua thuộc tính query_timeout
trong đối tượng kết nối.
Bạn có thể ghi đè các giá trị mặc định:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Hoặc chỉ định nó trong đối tượng kết nối:
const db = pgp({
/* all connection details */
query_timeout: 3000
});