この問題は、ここに記録されたものと同じです: 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]) + ')';
同じ結果が得られます。どちらでもいいです!;)