Dette problem er det samme, som blev logget her:https://github.com /vitaly-t/pg-promise/issues/442
Grundlæggende, pg-promise forespørgselsformateringsmotor genererer SQL i henhold til dine formateringsparametre. Det udfører IKKE nogen syntaksbekræftelse på din resulterende SQL.
Du genererer IN ()
, som er ugyldig SQL, så du får fejlen.
Du bør tjekke for tilstedeværelsen af variablen og ikke engang forsøge at generere en sådan forespørgsel, når variablen mangler, fordi din forespørgsel ikke ville være i stand til at give noget godt.
Eksempel:
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 */});
});
Der kan være andre løsninger, som pg-promise er meget generisk, det begrænser dig ikke den måde, du griber dette an på.
For eksempel i stedet for dette:
v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])
du kan gøre dette:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';
hvilket vil give samme resultat. Uanset hvad du kan lide!;)