开发问卷API:如何检测用户是否属于目标问卷的Moderator列表?
问题:判断用户是否有权审核指定问卷
我正在开发一个问卷处理API,核心需求是判断指定用户是否有权审核指定问卷,目前已在User和Survey实体间建立了多对多关系。
现有流程与限制
- 用户发送请求后,通过token验证可获取用户ID及邮箱地址
- 路由接收问卷ID作为输入,已从数据库获取到User和Survey的实例,但**user.moderates(用户侧关系名称)与survey.moderators(关系反向侧)**并未被加载
- 需要实现
hasAccess函数,检测该用户是否在目标问卷的审核者(Moderator)列表中
请求处理代码
user = await getUser(res.locals.keycloakId); if (user === null) { res.status(404).json({error: "User does not exist"}); } else { survey = getSurveyById(+req.params['id']); if (survey === null) { res.status(404).json({error: "Survey does not exist"}); } else { if (!await hasAccess(user, survey)) { res.status(403).json({error: "User is not allowed to access this survey"}); } } }
hasAccess函数当前结构
export async function hasAccess(user: User, survey: Survey): Promise<boolean> { if (// check if user has access to that survey) { return true; } else { return false; } }
解决方案
方案1:加载关联关系后检查
如果你的ORM支持延迟加载关联,可以先加载用户或问卷的关联数据,再做存在性检查:
export async function hasAccess(user: User, survey: Survey): Promise<boolean> { // 加载问卷的审核者列表(根据ORM调整方法,比如TypeORM的findOne带relations,或专用load方法) await survey.moderators; // 若ORM支持延迟加载,直接访问触发加载;否则调用survey.load('moderators')这类方法 // 检查当前用户是否在审核者列表中 return survey.moderators.some(moderator => moderator.id === user.id); }
方案2:直接数据库查询(性能更优)
无需加载整个关联集合,直接通过数据库查询验证关联是否存在,适合数据量较大的场景:
export async function hasAccess(user: User, survey: Survey): Promise<boolean> { // 以TypeORM为例,查询关联表中是否存在匹配记录 const hasPermission = await getRepository(User) .createQueryBuilder('user') .innerJoin('user.moderates', 'survey') .where('user.id = :userId', { userId: user.id }) .andWhere('survey.id = :surveyId', { surveyId: survey.id }) .getExists(); return hasPermission; }
注意事项
- 具体代码需根据你使用的ORM(如TypeORM、Prisma、Sequelize等)调整,比如Prisma可直接用
prisma.user.findUnique({ where: { id: user.id }, include: { moderates: { where: { id: survey.id } } } })判断是否存在关联 - 方案2的查询方式性能更好,避免了加载大量关联数据到内存中
内容的提问来源于stack exchange,提问作者Titus Tesche
相关产品推荐
相关产品推荐

