我有 Joi 模式,想添加一个自定义验证器来验证默认 Joi 验证器无法实现的数据。
目前,我使用的是 Joi 16.1.7 版本
const method = (value, helpers) => {
// for example if the username value is (something) then it will throw an error with flowing message but it throws an error inside (value) object without error message. It should throw error inside the (error) object with a proper error message
if (value === "something") {
return new Error("something is not allowed as username");
}
// Return the value unchanged
return value;
}; …Run Code Online (Sandbox Code Playgroud) 我在其中一条路线上进行了以下验证:
payload: {
keywordGroups: Joi.array().items(Joi.object().keys({
language: Joi.string().required(),
containsAny: Joi.array().items(Joi.string()).default([]).when('containsAll', { is: [], then: Joi.required() }),
containsAll: Joi.array().items(Joi.string()).default([]).when('containsAny', { is: [], then: Joi.required() }),
notContainsAll: Joi.array().items(Joi.string()).default([]),
notContainsAny: Joi.array().items(Joi.string()).default([])
})).required(),
}
Run Code Online (Sandbox Code Playgroud)
我试图让它containsAny或containsAll必须至少包含一个字符串.如果containsAny为空,containsAll则应至少有一个项目.如果containsAll是空的,containsAny至少应该包括一个项目.
但是Joi.when当涉及一系列对象时,它似乎并不真正起作用.
我已经使用 JOI 实现了此代码,其中用户必须发送 userId 和正文中的至少一个键。如何使用 ZOD 实现相同的功能?
params: Joi.object().keys({
userId: Joi.required().custom(objectId),
}),
body: Joi.object()
.keys({
name: Joi.string(),
email: Joi.string().email(),
password: Joi.string().custom(password),
})
.min(1),
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Joi 来验证 RESTful Web 服务接受的数据模型。
对于创建操作,我想对字段强制执行“必需”验证。但是,对于更新操作,可能会提交部分数据对象,因此我希望忽略“必需”属性。
除了创建两个模式之外,有没有办法实现这一点?
我希望如果输入字段中的位数少于/多于 14(例如),那么 joi 应该返回错误。
我怎么能用数字类型而不是字符串来做到这一点。
javascript 中的简单 joi 验证片段。当验证失败时,它只会返回一个错误对象。
验证.js
const Joi =require("joi");
function validateObject (input) {
const schema = {
key: Joi.string().required(),
};
return Joi.validate(input, schema);
};
let {error} = validateObject({key:5})
console.log(error)
Run Code Online (Sandbox Code Playgroud)
现在我正在学习打字稿并喜欢在 TS 中执行确切的功能。我知道 Joi 是一个 javascript 库,但我们可以在打字稿中使用它。探索时我遇到了一些替代方案,如https://github.com/ joiful-ts/joiful。
我很想知道是否有任何直接在 typescript 中使用Joi 的直接方法。或者做一点点改变,让 Joi 像在 Javascript 中一样工作。
我的尝试
验证文件
import * as Joi from "joi";
export const validateObject = (input: object) => {
const schema = {
home: Joi.string().required(),
};
return Joi.validate(input, schema);
};
validateObject({key:5})
Run Code Online (Sandbox Code Playgroud)
编译时,我收到错误
找不到名称“可迭代”。 …
将 Joi 升级到最新版本 @hapi/Joi(17.1.1) 后,我的服务器没有启动,启动时出现以下错误。最近的版本似乎有一些重大变化。尚无法获得任何线索,感谢任何帮助。
Error: Schema can only contain plain objects (name)
at new module.exports (/Users/xyz/project/projectxyz/node_modules/@hapi/hoek/lib/error.js:23:19)
at module.exports (/Users/xyz/project/projectxyz/node_modules/@hapi/hoek/lib/assert.js:20:11)
at Object.internals.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:88:5)
at Object.exports.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:17:26)
at internals.Base.$_compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/base.js:631:24)
at /Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/types/keys.js:255:92
at Object.exports.tryWithPath (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/common.js:173:16)
at internals.Base.method [as keys] (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/types/keys.js:255:32)
at Object.internals.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:90:25)
at Object.exports.schema (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:17:26)
at Object.exports.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/compile.js:117:24)
at Object.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/joi/lib/index.js:123:24)
at Object.exports.compile (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/validation.js:49:22)
at module.exports.internals.Route._setupValidation (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/route.js:197:43)
at new module.exports.internals.Route (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/route.js:122:14)
at internals.Server._addRoute (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/server.js:498:23)
at internals.Server.route (/Users/xyz/project/projectxyz/node_modules/@hapi/hapi/lib/server.js:491:22)
at /Users/xyz/project/projectxyz/src/app.js:73:14
at Array.forEach (<anonymous>)
at init (/Users/xyz/project/projectxyz/src/app.js:72:17)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at process.runNextTicks …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文件生成它究竟来自淳佳的架构.
有关如何做或任何不同方法的任何建议?
当我验证 graphql 参数时,我在密码字段中收到类似这样的错误消息。
"password" with value "" fails to match the required pattern: /^(?=\\S*[a-z])(?=\\S*[A-Z])(?=\\S*\\d)(?=\\S*[^\\w\\s])\\S{8,30}$/"
Run Code Online (Sandbox Code Playgroud)
我不想在错误消息中显示正则表达式模式。因此,我尝试为密码字段设置自定义错误消息,但它仍然显示正则表达式模式。
"password" with value "" fails to match the required pattern: /^(?=\\S*[a-z])(?=\\S*[A-Z])(?=\\S*\\d)(?=\\S*[^\\w\\s])\\S{8,30}$/"
Run Code Online (Sandbox Code Playgroud)
我认为它不是通过选择正则表达式object.regex。请帮忙。
joi ×10
node.js ×6
javascript ×4
hapijs ×3
validation ×3
mongoose ×2
typescript ×2
express ×1
graphql ×1
hapi ×1
mongodb ×1
zod ×1