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

开发问卷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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:28:17