Tento problém je stejný, jaký byl zaznamenán zde:https://github.com /vitaly-t/pg-promise/issues/442
V podstatě pg-promise dotazovací stroj pro formátování generuje SQL podle vašich parametrů formátování. Neprovádí žádné ověření syntaxe vašeho výsledného SQL.
Generujete IN ()
, což je neplatný SQL, takže se zobrazí chyba.
Měli byste zkontrolovat přítomnost proměnné a ani se nepokoušet generovat takový dotaz, když proměnná chybí, protože váš dotaz by pak nemohl přinést nic dobrého.
Příklad:
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 */});
});
Mohou existovat i jiná řešení, například pg-promise je velmi obecný, neomezuje vás způsob, jakým k tomu přistupujete.
Například místo tohoto:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
můžete to udělat:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
což přinese stejný výsledek. Cokoli se vám líbí!;)