标签: joi

如何在 Joi 中添加自定义验证器功能?

我有 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)

javascript validation node.js express joi

10
推荐指数
2
解决办法
2万
查看次数

使用嵌套对象进行Hapi/Joi验证

我在其中一条路线上进行了以下验证:

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)

我试图让它containsAnycontainsAll必须至少包含一个字符串.如果containsAny为空,containsAll则应至少有一个项目.如果containsAll是空的,containsAny至少应该包括一个项目.

但是Joi.when当涉及一系列对象时,它似乎并不真正起作用.

javascript validation hapijs joi

9
推荐指数
1
解决办法
5949
查看次数

Zod Schema Validation 中至少一个/最少一个字段

我已经使用 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)

mongodb node.js typescript joi zod

9
推荐指数
1
解决办法
2万
查看次数

在 Joi 验证中忽略“必需”?

我正在尝试使用 Joi 来验证 RESTful Web 服务接受的数据模型。

对于创建操作,我想对字段强制执行“必需”验证。但是,对于更新操作,可能会提交部分数据对象,因此我希望忽略“必需”属性。

除了创建两个模式之外,有没有办法实现这一点?

javascript validation joi

8
推荐指数
2
解决办法
3214
查看次数

如何使用 nodejs 从 joi 验证“位数”?

我希望如果输入字段中的位数少于/多于 14(例如),那么 joi 应该返回错误。

我怎么能用数字类型而不是字符串来做到这一点。

mongoose node.js joi

8
推荐指数
2
解决办法
2万
查看次数

在 Typescript 中实现 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)

编译时,我收到错误

找不到名称“可迭代”。 …

javascript typescript joi

8
推荐指数
1
解决办法
1万
查看次数

将 Joi 升级到最新版本后出错 - 架构只能包含普通对象(名称)

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

node.js hapi joi

8
推荐指数
1
解决办法
4978
查看次数

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 中为正则表达式设置自定义消息

当我验证 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。请帮忙。

error-handling joi graphql

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