Sự cố này giống như được ghi lại ở đây: https://github.com / importanty-t / pg-promise / Problem / 442
Về cơ bản, pg-promise công cụ định dạng truy vấn tạo SQL theo các tham số định dạng của bạn. Nó KHÔNG thực hiện bất kỳ xác minh cú pháp nào trên SQL kết quả của bạn.
Bạn đang tạo IN ()
, là SQL không hợp lệ, vì vậy bạn sẽ gặp lỗi.
Bạn nên kiểm tra sự hiện diện của biến và thậm chí không cố tạo một truy vấn như vậy khi biến đó bị thiếu, vì khi đó truy vấn của bạn sẽ không thể mang lại kết quả tốt.
Ví dụ:
router.get('/search', (req, res, next) => {
const variables = ['variable_a', 'variable_b', 'variable_c'];
const conditions = variables.filter(v => v in req.query)
.map(v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]]))
.join(' AND ');
conditions = conditions && 'WHERE ' + conditions;
db.any('SELECT * FROM food $1:raw', conditions)
.then(result => res.send(result))
.catch(error => {/* handle the error */});
});
Có thể có các giải pháp khác, như pg-promise rất chung chung, nó không giới hạn cách bạn tiếp cận vấn đề này.
Ví dụ:thay vì cái này:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
bạn có thể làm điều này:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
mà sẽ tạo ra cùng một kết quả. Tùy bạn thích!;)