Този проблем е същият като регистрирания тук:https://github.com /vitaly-t/pg-promise/issues/442
По принцип pg-promise машината за форматиране на заявки генерира SQL според вашите параметри за форматиране. Той НЕ прави никаква проверка на синтаксиса на получения ви SQL.
Вие генерирате IN ()
, което е невалиден SQL, така че получавате грешката.
Трябва да проверите за наличието на променливата и дори да не се опитвате да генерирате такава заявка, когато променливата липсва, защото заявката ви няма да може да даде нищо добро тогава.
Пример:
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 */});
});
Може да има и други решения, като pg-promise е много общ, не ви ограничава в начина, по който подхождате към това.
Например вместо това:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
можете да направите това:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
което ще доведе до същия резултат. Което ви харесва!;)