Hapijs和Joi:验证存在的查询参数:'禁止'
Hapijs and Joi: validate query params with presence: 'forbidden'
我的目标是为帖子创建索引路由。用户应该能够指定一些查询参数(如标签、类型),但不能指定其他参数。澄清:
这没关系:
/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()
}
}
我的想法是,验证应该允许type
和tags
参数的任何子集(包括空查询)。然而,在做出任何允许的请求后,我得到了以下错误:
{
"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] }
因此,您需要做的是将主对象标记为required
或optional
以覆盖forbidden
:
validate: {
query: Joi.object().required().keys({
type: Joi.string().optional(),
tags: Joi.string().optional()
})
}
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 参数变量出现ngTable指令问题
- AngularJS:我可以跳过函数参数回调吗
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 要求未定义JS回调参数
- 我的jQuery插件参数没有正确启动,遇到了问题
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- jquery设置为使用参数运行
- Javascript”;类“;带有参数的扩展
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 函数未将值作为参数传递
- 如何将参数传递到angularJs中的工厂
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- MVC 3页面导航和使用javascript传递参数
- 从查询字符串参数推断出正确的数据类型
- 传递包含'%的参数'在URL中
- 为什么不'我们在javascript中使用函数参数的数据类型
- Hapijs和Joi:验证存在的查询参数:'禁止'