首页 > 解决方案 > Joi - 对特定条件使用“有效”

问题描述

我尝试验证查询参数 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 列表验证。

标签: javascriptnode.jsvalidationjoi

解决方案


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
  });
}

推荐阅读