如何使用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,提问作者Марк
相关产品推荐
相关产品推荐

