You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TypeORM查询指定用户关注的账号发布的所有文章?

错误原因

  • 误用qb.select()方法:该方法用于指定查询返回的字段,不能直接拼接WHERE条件,导致生成的SQL语法完全不符合规范
  • 直接拼接用户ID字符串:UUID为字符串类型,直接用${userId}拼接不会自动添加引号,同时存在SQL注入风险,是你遇到的f5779e5附近语法错误的直接诱因
  • 逻辑错误:生成的SQL中authorId=targetUserId IN (...)的写法不符合SQL语法规则

正确实现

你可以直接用TypeORM提供的子查询构造能力来实现需求,代码如下:

applyFilter(query: QueryArticle, qb: SelectQueryBuilder<Article>, userId?: string) {
    if (query.filter && userId) {
      switch (query.filter) {
        case 'subscriptions':
          // 构造子查询获取当前用户关注的所有用户ID
          const subQuery = qb.subQuery()
            .select('sub.targetUserId')
            .from(Subscription, 'sub')
            .where('sub.userId = :currentUserId', { currentUserId: userId })
            .getQuery()

          // 主查询过滤作者ID在关注列表内的文章
          qb.where(`article.authorId IN ${subQuery}`)
          break
      }
    }
    return qb
}

补充说明

  • 所有变量用:参数名的方式绑定传值,TypeORM会自动处理数据类型转义、特殊字符过滤,完全避免SQL注入风险和字符串拼接导致的语法错误
  • 新增了userId存在性判断,避免用户未登录时userId为空导致生成无效SQL

内容的提问来源于stack exchange,提问作者Марк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:36:04