【问题标题】:How to get all the keys in a joi schema?如何获取 joi 模式中的所有键?
【发布时间】:2020-02-04 18:03:24
【问题描述】:

我有一个这样的 joi 架构

const userModel = Joi.object({
  id: Joi.string().min(3).max(50),
  username: Joi.string().min(10).max(100)
  ... other 10 properties
})

问题是我想获取所有键的值,例如

["id","username",...]

我尝试使用 Object.keys(userModel),但它返回了一个意外的值,例如

[
  "isJoi",
  "_currentJoi",
  "_type",
  "_settings",
  "_baseType",
  "_valids",
  "_invalids",
  "_tests",
  "_refs",
  "_flags",
  "_description",
  "_unit",
  "_notes",
  "_tags",
  "_examples",
  "_meta",
  "_inner"
]

【问题讨论】:

  • 为什么需要验证模式的键?
  • @a1300 我只需要从主要数据中选择必填字段......例如。如果主要数据是 {id:"123",username:"abc",email:"email.com"} 并且我的模型是 {id,name} 我只能使用像这样的工具从主要数据中选择所需的键lodash 的选择,它接受一个键数组作为它的第二个参数
  • 好的,请编辑您的问题并添加示例数据的外观。详细描述你试图达到的目标。应该需要哪些属性?这会让我更容易回答。

标签: javascript object joi


【解决方案1】:

这样的事情可能会有所帮助。

const userModel = Joi.object({
  id: Joi.string().min(3).max(50),
  username: Joi.string().min(10).max(100)
})


const keys = [];
for (var i of userModel._ids._byKey.entries()){
  keys.push(i[0])
}

console.log(keys);

【讨论】:

    【解决方案2】:

    出现意外行为的原因是因为 userModel 不是一个普通的对象,它是一个 joi 对象。

    一种可能的解决方案是检查userModel._ids._byKey.keys() 以获取架构中所有键的 Map 迭代器。此解决方案的问题在于您依赖 Joi 框架的内部结构。

    我可能会建议另一种方法:在单独的数据结构(数组或对象)中提取所需字段,并在此基础上扩展 Joi 模式。


    【讨论】:

    • 希望这个答案能得到更多的支持。令人震惊的简单,却解决了问题
    【解决方案3】:

    我自己也一直在为此苦苦挣扎。在对 api 进行了一些挖掘之后,我找到了this

    对于 Joi.object 这将返回一个简单的对象,该对象具有一个名为 keys 的属性

    {
      type: 'object',
      keys: {
        nestedItem1: { type: 'any', rules: [Array], allow: [Array] },
        nestedItem2: { type: 'string', flags: [Object], rules: [Array] },
      }
    }
    

    从那里开始非常简单。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2019-03-22
      • 2017-07-06
      • 2016-01-18
      • 1970-01-01
      • 2020-02-14
      • 2022-12-17
      • 2017-08-20
      • 2019-12-06
      相关资源
      最近更新 更多