我有一个我不可能知道的关键名称的对象 - 它们是由用户创建的.但是我确实知道它们(键)将要存储的值,并且它们(值)将成为ISO字符串.如何验证这些值?并且,可选地,如何验证未知对象的键,即:
key: Joi.string().min(2).max(25)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的是基于Joi API文档:
使用Joi.object([schema])而不是普通JS对象的另一个好处是>你可以在对象上设置任何选项,比如允许未知键,例如:
const schema = Joi.object({ arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), }).pattern(/firstname|lastname/, Joi.string().min(2));
我从这个例子中理解的是,argkey表示Joi.object()'s' key,value代表它value.
我的例子:
campaign: Joi.object({
arg: Joi.string().valid( 'unknown' ),
value: Joi.date().iso(),
}).pattern( /unknown/, Joi.string().min(2).max(25) )
Run Code Online (Sandbox Code Playgroud)
我的意见;
campaign: { g_ad_adwords: "2017-01-19T11:33:26.205Z" }
Run Code Online (Sandbox Code Playgroud)
我的错误:
"广告系列"失败,因为["g_ad_adwords"不允许]
我有一个名为 user 的 joi 架构
const user = {
firstName: Joi.string()
.min(2)
.max(50)
.required()
.label('First Name'),
lastName: Joi.string()
.min(3)
.max(50)
.required()
.label('Last Name'),
email: Joi.string()
.allow('')
.email({ minDomainAtoms: 2 })
.max(100)
.label('Email Address'),
}
Run Code Online (Sandbox Code Playgroud)
我还有一个叫owner
const ownerSchema = {
firstName: Joi.string()
.min(2)
.max(50)
.required()
.label('First Name'),
lastName: Joi.string()
.min(3)
.max(50)
.required()
.label('Last Name'),
email: Joi.string()
.allow('')
.email({ minDomainAtoms: 2 })
.max(100)
.label('Email Address'),
number: Joi.string()
.regex(/[0-9]/)
.length(10)
.required()
.label('Phone Number'),
dateOfBirth: Joi.date(),
kycDetails: Joi.array()
.items(schemaKyc)
.required(),
bankDetails: Joi.array()
.items(schemaBank)
.required(), …Run Code Online (Sandbox Code Playgroud) 我使用 Joi 库作为我的 CRA 项目的独立验证器,但是在触发email()验证器时,我收到了神秘错误
Uncaught Error: Built-in TLD list disabled
如果我有两个字段,我只想验证至少一个字段是非空字符串,但是当两个字段都是空字符串时失败.
这样的事情无法验证
var schema = Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).or('a', 'b');
Run Code Online (Sandbox Code Playgroud)
验证时
{a: 'aa', b: ''}
Run Code Online (Sandbox Code Playgroud)
该or条件只测试了两种关键的存在a或b,但确实为条件测试是否a还是b如此.Joi.string()空字符串会失败.
以下是一些要展示的测试用例的要点
我正在使用Joi包进行服务器端验证.
我想检查一个给定的字符串是否在给定的列表中,或者它是否不在给定的列表中.(定义黑名单或值列表的白名单),
如"in"或"notIn"函数.我可以这样做吗? ?
var schema = Joi.object().keys({
firstname: Joi.string().in(['a','b']),
lastname : Joi.string().notIn(['c','d']),
});
Run Code Online (Sandbox Code Playgroud) 我想在调用控制器逻辑之前验证我的Express路由。我使用joi并创建了一个验证器,该验证器能够针对架构对象验证Request对象
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike, ValidationError, ValidationResult } from '@hapi/joi';
import { injectable } from 'inversify';
@injectable()
export abstract class RequestValidator {
protected validateRequest = (validationSchema: SchemaLike, request: Request, response: Response, next: NextFunction): void => {
const validationResult: ValidationResult<Request> = joi.validate(request, validationSchema, {
abortEarly: false
});
const { error }: { error: ValidationError } = validationResult;
if (error) {
response.status(400).json({
message: 'The request validation failed.',
details: error.details
});
} else {
next(); …Run Code Online (Sandbox Code Playgroud) 我正在使用Joi验证器来处理我的HTTP请求.我有一个名为的参数type.我需要确保参数的可能值是"ios"或"android".
我怎样才能做到这一点?
body : {
device_key : joi.string().required(),
type : joi.string().required()
}
Run Code Online (Sandbox Code Playgroud) 我需要创建动态模式以根据请求查询中的键node js使用Joi 验证器来验证我的 api请求查询。说下面提到的模式是我的有效查询。
我正在使用hapi/joi版本16.1.8
组合1
{ type: 1, firstname: 'user first name', lastname: 'user last name'}
Run Code Online (Sandbox Code Playgroud)
组合2
{ type: 2 , salary: 1000, pension: 200}
Run Code Online (Sandbox Code Playgroud)
组合3
{ type: 3 , credit: 550, debit: 100}
Run Code Online (Sandbox Code Playgroud)
如您所见,对象键因 的值而异type。如何正确处理?
我们可以使用Joi.alternatives处理两个条件,例如
const schema = Joi.alternatives().conditional(Joi.object({ type: 1 }).unknown(), {
then: Joi.object({
type: Joi.string(),
firstname: Joi.string(),
lastname: Joi.string()
}),
otherwise: Joi.object({
type: Joi.number(),
salary: Joi.any(),
pension: Joi.any()
})
});
Run Code Online (Sandbox Code Playgroud)
但是如何在 3 个条件下做到这一点?
我想从 Typescript 类型或接口生成一些 joi 模式对象。在我最初的搜索中,我发现了一些相反的事情(从 joi 模式生成 Typescript 类型/接口),并且ts-interface-builder提供ts-interface-checker了一些基于 Typescript 类型/接口创建运行时检查器的能力,但仍然缺乏功能支持,并且整个使用围绕道具/方法的类和装饰器来完成此任务的一堆粗糙的东西。
有没有什么东西可以生成这样的 joi 模式?或者有更成熟的接口/类型运行时检查替代方案?(当从数据库中提取并确保来自数据库的响应具有正确的结构时很有用)
编辑:我想在这个io-ts github问题上有一个关于此类问题的很好的帖子。
我目前正在HapiJS/NodeJS中使用Joi来验证数据.一个POST特别具有两个ISO日期(开始日期和结束日期),这两个日期被传递到路线并经过验证以确保它们是ISO日期.
{
method: 'POST',
path: '/api/calendar',
handler: calendar.getInfo,
config: {
validate: {
payload: {
start: Joi.date().iso(),
end: Joi.date().iso()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过这两个日期并在控制器中进行一些验证,以确保开始日期在结束日期之前(即,开始日期不能是2月,结束日期是1月).
我的问题是,如果有一种方法让Joi确定这个并且出错了吗?如果需要更多信息,请与我们联系.
谢谢!Ť