javascript - Joi - 针对特定条件使用 'valid'

标签 javascript node.js validation 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 验证,如果不是 - 通过正则表达式 + 有效 ID 列表验证。

最佳答案

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

关于javascript - Joi - 针对特定条件使用 'valid',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256160/

相关文章:

iphone - 电话号码的 NSTextCheckingResult

javascript - 接口(interface)和 Getters\Setters

javascript - 具有多种功能的 Angular 自定义计算器

javascript - node js Express 连接mysql

mysql - 我需要通过 fs.readfile 获取图像文件,我想将二进制数据存储在 MySQL 表中。我该怎么做

java - JTextField 仅将输入限制为某些字符

javascript - 这个网站是如何实现响应式布局的

只有 1 个 div 的 Javascript 翻页效果

node.js - 具有持久数据的NodeJS + RxDB + Electron

尝试排除逗号时,Java RegEx 模式无效