Knex 没有正确转义原始 postgres 查询

Knex not properly escaping raw postgres queries

我正在使用 Knex(带有打字稿)来尝试查询 postgres 数据库。我的数据库 table products 有一个列 name,当用户在搜索框中键入内容时,我想搜索该列。例如,仅查询字母 'p' 应该 return 名称中包含以 'p' 开头的单词的所有产品。为此,我使用了 ts_vectorts_query 函数。我的查询如下所示:

const query = ... // got from user input
const result = await knex(knex.raw('products'))
  .whereRaw(`to_tsvector(name) @@ to_tsquery('?:*')`, query)
  .select('*')

当我运行这个查询时,我得到以下错误:

Unhandled error { error: select * from products where to_tsvector(name) @@ to_tsquery(':*') - bind message supplies 1 parameters, but prepared statement "" requires 0

如果我将 whereRaw 行替换为:.whereRaw(`to_tsvector(name) @@ to_tsquery('p:*')`),它会正确 运行 查询,选择名称包含以 P 开头的单词的产品。

postgres 语法和 knex 的原始查询似乎有一些冲突。我想使用原始查询而不是使用 `${query}:*`,因为我希望我的输入被清理并防止 SQL 注入。我怎样才能让 Knex 正确地逃避这个?

我尝试了引号、斜杠和冒号的各种组合,但 none 似乎有效。任何帮助将不胜感激。

PostgreSQL 不处理引号内的占位符(我有点惊讶 knex 会处理)。

您需要在 PostgreSQL 中明确地进行连接:

.whereRaw(`to_tsvector(name) @@ to_tsquery(? ||':*')`,query)

或打字稿内:

.whereRaw(`to_tsvector(name) @@ to_tsquery(?)`, query+":*")