我的目标是为帖子创建索引路径.用户应该能够指定一些查询参数(即标签,类型),但不能指定其他参数.澄清:
这没关系:
/posts
/posts?tags=food
/posts?type=regular&tags=stackoverflow
Run Code Online (Sandbox Code Playgroud)
这不行:
/posts?title=Hello
Run Code Online (Sandbox Code Playgroud)
这是hapi pack配置:
servers: [
{
host: 'localhost',
port: 3000,
options: {
labels: ["api"],
validation: {
abortEarly: false,
presence: 'forbidden'
}
}
}
],
Run Code Online (Sandbox Code Playgroud)
请注意该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()
}
}
Run Code Online (Sandbox Code Playgroud)
我的想法是验证应该允许type
和tags
params的任何子集(包括空查询).但是,在进行任何允许的请求后,我收到以下错误:
{
"statusCode": 400,
"error": "Bad Request",
"message": "value is not allowed", …
Run Code Online (Sandbox Code Playgroud) 如何检查密码和password_confirmation是否相同?
var Joi = require('joi'),
S = Joi.string().required().min(3).max(15);
exports.create = {
payload: {
username: S,
email: Joi.string().email(),
password: S,
password_confirmation: S
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Hapi开发一个Web服务,Mongoose作为ODM,Joi作为验证器.我真的很喜欢Joi的验证以及它与HAPI连接的方式(我需要Joi的描述函数来显示一些swagger的描述)但是我不想维护两个模式,一个用于Joi,一个用于mongoose; 我想使用Joi定义我的模式,然后只能导出Mongoose所需的基本模式.例如:
mySchema.js
module.exports = {
name : String,
address: String
}
Run Code Online (Sandbox Code Playgroud)
myValidator.js
module.exports = {
payload: {
name: Joi.description('A name').string().required(),
address: Joi.description('An address').string()
}
}
Run Code Online (Sandbox Code Playgroud)
myModel.js
const mongoose = require('mongoose'),
mySchema = require('./mySchema');
var schemaInstance = new mongoose.Schema(mySchema),
myModel = mongoose.model('myModel', schemaInstance);
Run Code Online (Sandbox Code Playgroud)
myHapiRoute.js
const myValidator = require('./myValidator.js'),
myController = require('./myController.js');
...
{
method: 'POST',
path: '/create',
config: {
description: 'create something',
tags: ['api'],
handler: myController,
validate: myValidator
}
}
...
Run Code Online (Sandbox Code Playgroud)
我想避免麻烦,保持mySchema.js文件生成它究竟来自淳佳的架构.
有关如何做或任何不同方法的任何建议?
有没有办法将两个joi模式合并为一个模式?
架构1
{
alpha: Joi.number().required(),
beta: Joi.string().required(),
chalie: Joi.object({
xray: Joi.number().required(),
}).required()
}
Run Code Online (Sandbox Code Playgroud)
架构1
{
delta: Joi.string().required(),
echo: Joi.number().required(),
charlie: Joi.object({
zulu: Joi.string().required(),
}).required()
}
Run Code Online (Sandbox Code Playgroud)
合并架构:
{
alpha: Joi.number().required(),
beta: Joi.string().required(),
chalie: Joi.object({
xray: Joi.number().required(),
zulu: Joi.string().required(),
}).required()
delta: Joi.string().required(),
echo: Joi.number().required(),
}
Run Code Online (Sandbox Code Playgroud)
没有嵌套对象,它很容易完成Object.assign
,但即使深层对象合并也不能与嵌套对象一起使用,因为嵌套对象是一个函数调用.
我在某处阅读了一篇文章,其中作者使用Joi通过检查数据库来异步验证用户名是否唯一。我现在找不到它,我想知道我们如何使用Joi
.
使用Hapi.JS Joi验证Express应用程序的输入.这是一个样板设置:
const Joi = require('joi');
const schema = Joi.object().keys({
username: Joi.string().alphanum().min(3).max(30).required(),
birthyear: Joi.number().integer().min(1900).max(2013),
}).with('username', 'birthyear');
app.use('/user/:id', function (req, res, next) {
Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function
(err, value) {
if (err){
...
}
...
next()
}
});
})
Run Code Online (Sandbox Code Playgroud)
问题#1:验证和消毒之间有什么区别?我应该清理Express API的输入吗?这是一个移动应用程序,而不是一个网站,所以我试图了解我是否应该验证以及消毒.
问题#2 如何使用Joi或其他Express兼容库清理输入?
我想验证一个只有两个字段(即文本和图像)的输入。这两个文本和图像的字符串,其中一人必须始终存在。当其中一个字段不存在时,另一个字段不能是空字符串。这是我定义的验证。
text: Joi.string()
.when('image',
{
is: Joi.string(),
then: Joi.string().allow(''),
otherwise: Joi.string().required(),
}
),
image: Joi.string().allow(null),
Run Code Online (Sandbox Code Playgroud)
当我使用以下输入时,验证允许数据通过。我不知道如何更改验证以禁止以下输入。
post: {
text: ''
}
Run Code Online (Sandbox Code Playgroud) 我想用 Yup 或 Joi 实现前端验证。
从我找到的所有文档和文章中,我得出了几个结论:
然而,我没能找到Joi 与 Yup 相比在支持方面缺乏什么?
现在,从所有这些结论来看,它选择拥有更小的捆绑包或更好的性能。
我有一个对象数组要从特定模式进行验证,如果任何对象与给定模式匹配,我想对其进行验证并忽略其他模式并移至下一个数组项。
我尝试了 Joi.alternatives,但它会检查所有模式,而不是仅检查一个匹配的模式。
我的验证器:
Joi.array().min(1).max(49).items(Joi.object({
type: Joi.number().valid([1, 2, 3, 4]).required()
}).when(Joi.object({
type: Joi.number().valid(1)
}).unknown(), {
then: profile1
}).when(Joi.object({
type: Joi.number().valid(2)
}).unknown(), {
then: profile2
}).when(Joi.object({
type: Joi.number().valid(3)
}).unknown(), {
then: profile3
}))
Run Code Online (Sandbox Code Playgroud)
配置文件1//类型1
export default Joi.object().keys({
type: Joi.number().valid([1, 2, 3]).required(),
surname: Joi.string().max(50).allow(""),
givenname: Joi.string().max(50).allow("")
}).unknown(true)
Run Code Online (Sandbox Code Playgroud)
配置文件2//类型2
export default Joi.object().keys({
type: Joi.number().valid([1, 2, 3]).required(),
address: Joi.string().max(50).allow(""),
initialname: Joi.string().max(50).allow(""),
surname: Joi.string().max(50).allow(""),
data: Joi.array.min(1).max(29).items(Joi.object({
code: Joi.string().max(20).allow(""),
number: Joi.string().max(20).allow(""),
}),
address1: Joi.array.min(1).max(29).items(Joi.object({
city: Joi.string().max(20).allow(""),
postal: Joi.string().max(20).allow(""),
})
}).unknown(true)
Run Code Online (Sandbox Code Playgroud)
配置文件3//类型3
export default Joi.object().keys({
type: Joi.number().valid([1, …
Run Code Online (Sandbox Code Playgroud) 我的架构是:
const scenerioSchema = Joi.object({
drawingNode: Joi.object({
moduleRackOutputs: Joi.array()
.items(
Joi.object({
moduleId: Joi.string().required()
})
)
.unique((a, b) => a.moduleId !== b.moduleId)
})
})
Run Code Online (Sandbox Code Playgroud)
我的数据是:
const mockScenario1 = {
drawingNode: {
moduleRackOutputs: [
{
moduleId: 'module1'
},
{
moduleId: 'module2'
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
当我验证时:
const validationResponse = scenerioSchema.validate(mockScenario1)
Run Code Online (Sandbox Code Playgroud)
我得到:
{
validationResponse: {
value: { drawingNode: [Object] },
error: [Error [ValidationError]: "drawingNode.moduleRackOutputs[1]" contains a duplicate value] {
_original: [Object],
details: [Array]
}
}
}
Run Code Online (Sandbox Code Playgroud)
moduleId
但 (a) 这不是真的 - 这些项目不是重复的,并且 (b) …