gpt4 book ai didi

javascript - Hapijs 和 Joi : validate query params with presence: 'forbidden'

转载 作者:数据小太阳 更新时间:2023-10-29 05:12:27 27 4
gpt4 key购买 nike

我的目标是为帖子创建一个索引路径。用户应该能够指定一些查询参数(即标签、类型),但不能指定其他参数。澄清一下:

没关系:

/posts
/posts?tags=food
/posts?type=regular&tags=stackoverflow

这不行:

/posts?title=Hello

这是 hapi 包配置:

servers: [
{
host: 'localhost',
port: 3000,
options: {
labels: ["api"],
validation: {
abortEarly: false,
presence: 'forbidden'
}
}
}
],

请注意 presence: forbidden 选项。

这是路由配置:

handler: function (request, reply) {
Post.find(request.query, function (err, posts) {
if(err) {
console.log(err);
}

reply(posts);
});
},
validate: {
query: {
type: Joi.string().optional(),
tags: Joi.string().optional()
}

}

我的想法是验证应该允许 typetags 参数的任何子集(包括空查询)。但是,在发出任何允许的请求后,我收到以下错误:

{
"statusCode": 400,
"error": "Bad Request",
"message": "value is not allowed",
"validation": {
"source": "query",
"keys": [
"value"
]
}
}

这是为什么呢?当然没有名为 value 的键。如何使验证按照我想要的方式进行?

最佳答案

如果您定义一个非类型模式对象,Joi 会在内部将其转换为 object()。类型。所以这个模式:

var schema = {
type: Joi.string().optional(),
tags: Joi.string().optional()
};

变成:

var schema = Joi.object().keys({
type: Joi.string().optional(),
tags: Joi.string().optional()
});

因为你在服务器设置中将presence设置为forbidden,它被应用于对象类型,所以模式变成:

var schema = Joi.object().forbidden().keys({
type: Joi.string().optional(),
tags: Joi.string().optional()
});

如您所见,它将主要对象标记为禁止,除了 undefined 之外不允许任何值:

var Joi = require('joi');

var schema = Joi.object().forbidden().keys({
type: Joi.string().optional(),
tags: Joi.string().optional()
});

var value = {};

Joi.validate(value, schema, { presence: 'forbidden' }, function (err, value) {

console.log(err);
});

输出:

{ [ValidationError: value is not allowed]
name: 'ValidationError',
details:
[ { message: 'value is not allowed',
path: 'value',
type: 'any.unknown' } ],
_object: {},
annotate: [Function] }

因此您需要做的是将主要对象标记为requiredoptional 以覆盖forbidden:

validate: {
query: Joi.object().required().keys({
type: Joi.string().optional(),
tags: Joi.string().optional()
})
}

关于javascript - Hapijs 和 Joi : validate query params with presence: 'forbidden' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26214642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com