是否可以向“@hapi/joi”模式对象添加额外的逻辑?
Is it possible to add an additional piece of logic to a "@hapi/joi" schema object?
const Joi = require('@hapi/joi');
function validateInput(input)({
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
numApples: Joi.number().min(1).max(5).required(),
numOranges: Joi.number().min(1).max(5).required()
});
return schema.validate(input);
}
我想做的是,如果苹果和橙子的总数不等于 3 个或更多,则抛出一个错误。
是否可以使用@hapi/joi以这种方式添加自定义逻辑?
您可以定义一个新值 numApplesAndOranges
并将其设置为 numApples
+ numOranges
,然后再将其包含在您的架构中。
您现在可以这样测试:numApplesAndOranges: Joi.number().min(3).required()
。
完整代码如下:
const Joi = require('@hapi/joi');
function validateInput(input)({
const numApplesAndOranges = input.numApples + input.numOranges;
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
numApples: Joi.number().min(1).max(5).required(),
numOranges: Joi.number().min(1).max(5).required(),
numApplesAndOranges: Joi.number().min(3).required()
});
return schema.validate({...input, numApplesAndOranges});
}
您可以执行类似以下操作:
const Joi = require('@hapi/joi');
function validateInput(input) {
// custom validation function by hapi/joi
const sum = function(fields = [], maxValue) {
return function(value, helpers) {
const sum = 0
fields.forEach(f => {
sum = sum + +input[f];
});
if (sum > maxValue) {
return helpers.error('any.invalid');
}
}
}
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
numApples: Joi.number().min(1).max(5).required(),
numOranges: Joi.number().min(1).max(5).required().custom(sum(['numApples', 'numOranges'], 3))
});
return schema.validate(input);
您可以在 Joi here 中了解有关自定义验证的更多信息。
希望对您有所帮助!
const Joi = require('@hapi/joi');
function validateInput(input)({
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
numApples: Joi.number().min(1).max(5).required(),
numOranges: Joi.number().min(1).max(5).required()
});
return schema.validate(input);
}
我想做的是,如果苹果和橙子的总数不等于 3 个或更多,则抛出一个错误。 是否可以使用@hapi/joi以这种方式添加自定义逻辑?
您可以定义一个新值 numApplesAndOranges
并将其设置为 numApples
+ numOranges
,然后再将其包含在您的架构中。
您现在可以这样测试:numApplesAndOranges: Joi.number().min(3).required()
。
完整代码如下:
const Joi = require('@hapi/joi');
function validateInput(input)({
const numApplesAndOranges = input.numApples + input.numOranges;
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
numApples: Joi.number().min(1).max(5).required(),
numOranges: Joi.number().min(1).max(5).required(),
numApplesAndOranges: Joi.number().min(3).required()
});
return schema.validate({...input, numApplesAndOranges});
}
您可以执行类似以下操作:
const Joi = require('@hapi/joi');
function validateInput(input) {
// custom validation function by hapi/joi
const sum = function(fields = [], maxValue) {
return function(value, helpers) {
const sum = 0
fields.forEach(f => {
sum = sum + +input[f];
});
if (sum > maxValue) {
return helpers.error('any.invalid');
}
}
}
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
numApples: Joi.number().min(1).max(5).required(),
numOranges: Joi.number().min(1).max(5).required().custom(sum(['numApples', 'numOranges'], 3))
});
return schema.validate(input);
您可以在 Joi here 中了解有关自定义验证的更多信息。
希望对您有所帮助!