Masalah ini sama dengan yang dicatat di sini:https://github.com /vitaly-t/pg-promise/issues/442
Pada dasarnya, pg-promise mesin pemformatan kueri menghasilkan SQL sesuai dengan parameter pemformatan Anda. Itu TIDAK melakukan verifikasi sintaks apa pun pada SQL yang Anda hasilkan.
Anda membuat IN ()
, yang merupakan SQL yang tidak valid, sehingga Anda mendapatkan kesalahan.
Anda harus memeriksa keberadaan variabel, dan bahkan tidak mencoba membuat kueri seperti itu saat variabel tidak ada, karena kueri Anda tidak akan dapat menghasilkan sesuatu yang baik saat itu.
Contoh:
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 */});
});
Mungkin ada solusi lain, seperti pg-promise sangat umum, tidak membatasi cara Anda mendekati ini.
Misalnya, alih-alih ini:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
Anda dapat melakukan ini:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
yang akan menghasilkan hasil yang sama. Apapun yang Anda suka!;)