Dit probleem is hetzelfde als hier is vastgelegd:https://github.com /vitaly-t/pg-promise/issues/442
Kortom, pg-promise query formatting engine genereert SQL volgens uw opmaakparameters. Het voert GEEN syntaxisverificatie uit op uw resulterende SQL.
U genereert IN ()
, wat een ongeldige SQL is, dus je krijgt de foutmelding.
U moet de aanwezigheid van de variabele controleren en zelfs niet proberen een dergelijke zoekopdracht te genereren als de variabele ontbreekt, omdat uw zoekopdracht dan niets goeds zou kunnen opleveren.
Voorbeeld:
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 */});
});
Er kunnen andere oplossingen zijn, zoals pg-promise is erg algemeen, het beperkt je niet in de manier waarop je dit benadert.
Bijvoorbeeld, in plaats van dit:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
je kunt dit doen:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
wat hetzelfde resultaat zal opleveren. Wat je ook leuk vindt!;)