【问题标题】:Joi - use 'valid' for specific conditionJoi - 对特定条件使用“有效”
【发布时间】:2019-07-29 14:42:59
【问题描述】:

我尝试验证查询参数 userId。

如果用户是管理员,那么他可以使用任何用户 ID。

如果不是 - 则使用特定数组中的唯一 id。

const validUserIds = isUserAdmin ? req.query.userId : userIds;
const schema = Joi.object().keys({
    userId: Joi.string().optional().regex(UUIDRegex).valid(validUserIds),
  });
Joi.validate(req.query, schema).then(.....);

问题:当我们发送错误的用户 ID(例如'abc'等,正则表达式验证应该失败)并且用户是管理员然后验证成功。

我可以创建这样的内容吗:如果用户是管理员,则仅通过 rexeg 验证,如果不是 - 通过 regex + 有效 id 列表验证。

【问题讨论】:

    标签: javascript node.js validation joi


    【解决方案1】:

    Joi.when 在这里听起来像是正确的功能。

    userId: Joi.string()
      .regex(UUIDRegex)
      .when('isUserAdmin', {
        is: false,
        then: yourValidateUserIdFunction() // validate
      });
    

    通读后,我们检查用户 ID 是否为字符串,然后检查它是否与所有用户的 UUIDRegex 匹配,最后检查用户 ID 在用户不是管理员时是否有效。

    或者,如果isUserAdmin 在 Joi 架构之外,则根据该信息创建两个不同的架构:

    const isUserAdmin = true;
    if (isAdmin) {
      joi.object({
        userId: Joi.string().regex(UUIDRegex),
      });
    } else {
      joi.object({
        userId: Joi.string().regex(UUIDRegex).validateUserId(), // validate
      });
    }
    

    【讨论】:

    • 问题是用户管理员,它在 Joi 模式之外。我有 req.query 对象来验证。而且我还有另一个变量req.user.isAdmin,所以我不能写.when('req.user.isAdmin', { is: false .....})
    • 感谢您的反馈。我试图通过展示如何根据架构外的信息来分叉架构定义来做出回应。
    • 感谢这个想法。我决定创建 1 个模式,因为我有很多键。对于用户 ID,我写了这个: userId: ?是管理员? Joi.string....... : Joi.string......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2016-08-05
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多