Det här problemet är detsamma som loggades här:https://github.com /vitaly-t/pg-promise/issues/442
I grund och botten, pg-promise frågeformateringsmotorn genererar SQL enligt dina formateringsparametrar. Den gör INTE någon syntaxverifiering på din resulterande SQL.
Du genererar IN ()
, som är ogiltig SQL, så du får felet.
Du bör kontrollera förekomsten av variabeln och inte ens försöka generera en sådan fråga när variabeln saknas, eftersom din fråga inte skulle kunna ge något bra då.
Exempel:
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 */});
});
Det kan finnas andra lösningar, som pg-promise är mycket generisk, det begränsar inte hur du närmar dig detta.
Till exempel, istället för detta:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
du kan göra så här:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
vilket ger samma resultat. Vilket du än gillar!;)