Ten problem jest taki sam, jak został zarejestrowany tutaj:https://github.com /vitaly-t/pg-promise/issues/442
Zasadniczo pg-promise aparat formatowania zapytań generuje kod SQL zgodnie z parametrami formatowania. NIE wykonuje żadnej weryfikacji składni na wynikowym SQL.
Generujesz IN ()
, który jest nieprawidłowym kodem SQL, więc pojawia się błąd.
Powinieneś sprawdzić obecność zmiennej, a nawet nie próbować generować takiego zapytania, gdy brakuje zmiennej, ponieważ twoje zapytanie nie dałoby wtedy niczego dobrego.
Przykład:
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 */});
});
Mogą istnieć inne rozwiązania, jak pg-promise jest bardzo ogólny, nie ogranicza sposobu, w jaki do tego podchodzisz.
Na przykład zamiast tego:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
możesz to zrobić:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
co przyniesie ten sam wynik. Cokolwiek chcesz!;)