有什么方法可以在 TypeORM 的 select 部分绑定参数吗?

Is there any way to bind parameter in select section for TypeORM?

我正在尝试在使用 TypeScript 和 TypeOrm 编写的项目中使用 PostgreSQL 中的 pg_trgm 模块实现搜索。 SQL 对我有用的是这样的:

SELECT t, similarity(t, 'word') AS sml
  FROM test_trgm
  WHERE t % 'word'
  ORDER BY sml DESC, t;

但是当我开始将它集成到我的构建器中时,我意识到我无法保护 select 语句免受 SQL 注入,因为 TypeOrm 不提供在任何 select方法(如SelectQueryBuilder::addSelectSelectQueryBuilder::select)。

我的漏洞方法示例:

...
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
    if (needle) {
      builder.addSelect(`similarity(title, ${needle})`);
      builder.andWhere('title % :needle', { needle });
    }
  }
...

也许有人知道在我的技术栈中实现此搜索的更好方法?

此问题的决定是在 whereselect 语句中使用相同的绑定密钥以接下来的方式。

applySearch(builder: SelectQueryBuilder<any>, needle: string) {
    if (needle) {
      builder.addSelect(`similarity(title, :needle)`);
      builder.andWhere('title % :needle', { needle });
    }
  }

我需要一个类似的解决方案,但是你的解决方案不适合我。如果您想更改 select 中的参数,您应该查看 setParameter,这是 addWhere 的第二个参数在内部所做的。

https://github.com/typeorm/typeorm/blob/master/docs/select-query-builder.md#using-parameters-to-escape-data

所以在你的情况下你可以 运行 和

applySearch(builder: SelectQueryBuilder<any>, needle: string) {
    if (needle) {
      builder.addSelect(`similarity(title, :title)`);
      builder.andWhere('title % :needle', { needle });
      builder.setParameter('title', needle);
    }
  }