javascript - 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 列表验证。
解决方案
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
});
}
推荐阅读
- java - java线程顺序
- javascript - 地图与对象时间复杂度(Node.js)
- ios - 如何从位置管理器只复制一次用户位置?
- r - 将概率模型拟合到 3 个标准正态协变量的 200 个观测值
- c# - 将类型“Emgu.CV.Mat”转换为“Emgu.CV.Image”
' - sql - 如何在 SQL WHERE 子句中包含条件 OR 语句
- java - 使用四元数移动
- laravel - Laravel:如果失败,如何以编程方式运行作业 5 次?
- c++ - 在(例如)循环中初始化一个变量会比只使用一个已经定义的变量效率低吗?
- python - 根据子字符串限制将字符串列表拆分为列表列表