标签: joi

Hapijs和Joi:使用在线验证查询参数:'forbidden'

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

这没关系:

/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)

我的想法是验证应该允许typetagsparams的任何子集(包括空查询).但是,在进行任何允许的请求后,我收到以下错误:

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": "value is not allowed", …
Run Code Online (Sandbox Code Playgroud)

javascript node.js hapijs joi

7
推荐指数
1
解决办法
7878
查看次数

hapi route joi验证密码确认

如何检查密码和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)

node.js hapijs joi

7
推荐指数
2
解决办法
4855
查看次数

在Mongoose和Joi之间只维护一个模式的最佳方法

我正在使用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文件生成它究竟来自淳佳的架构.

有关如何做或任何不同方法的任何建议?

mongoose node.js hapijs joi mongoose-schema

7
推荐指数
1
解决办法
3664
查看次数

有没有办法合并Joi Schemas?

有没有办法将两个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,但即使深层对象合并也不能与嵌套对象一起使用,因为嵌套对象是一个函数调用.

validation merge object joi

7
推荐指数
5
解决办法
3538
查看次数

如何使用 joi 验证用户名是否唯一?

我在某处阅读了一篇文章,其中作者使用Joi通过检查数据库来异步验证用户名是否唯一。我现在找不到它,我想知道我们如何使用Joi.

javascript validation node.js hapijs joi

7
推荐指数
1
解决办法
2457
查看次数

在Hapi Joi/Express应用程序中验证和消毒输入之间的区别是什么?

使用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兼容库清理输入?

security node.js express hapijs joi

7
推荐指数
1
解决办法
1509
查看次数

Joi - 根据其他键的值需要

我想验证一个只有两个字段(即文本和图像)的输入。这两个文本图像的字符串,其中一人必须始终存在。当其中一个字段不存在时,另一个字段不能是空字符串。这是我定义的验证。

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)

node.js joi

7
推荐指数
1
解决办法
1037
查看次数

是的 vs Joi 进行前端验证

我想用 Yup 或 Joi 实现前端验证。

从我找到的所有文档和文章中,我得出了几个结论:

然而,我没能找到Joi 与 Yup 相比在支持方面缺乏什么

现在,从所有这些结论来看,它选择拥有更小的捆绑包或更好的性能。

validation frontend joi yup

7
推荐指数
2
解决办法
2921
查看次数

Joi 验证:如果对象与模式匹配,则从多个项目中对其进行验证

我有一个对象数组要从特定模式进行验证,如果任何对象与给定模式匹配,我想对其进行验证并忽略其他模式并移至下一个数组项。

我尝试了 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)

javascript validation node.js joi

7
推荐指数
1
解决办法
1227
查看次数

为什么 Joi 验证对象数组“包含重复值”?

我的架构是:

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) …

javascript validation joi

6
推荐指数
1
解决办法
1639
查看次数