【问题标题】:Descriptive Hapi/Joi validation error描述性 Hapi/Joi 验证错误
【发布时间】:2015-04-29 02:53:40
【问题描述】:

我一直在尝试在我们的节点应用程序中实现 Joi(joi 作为独立的,而不是 hapi),它似乎正确验证了架构,但错误总是相同的

[ValidationError: value must be an object] 
name: 'ValidationError',
details:
[ { message: 'value must be an object',
   path: 'value',
   type: 'object.base',
   context: [Object] } ],
_object:.....

我从来没有得到它失败的具体细节以及失败原因的描述。

这是我正在使用的示例架构:

exports.workersSchema =
{
workers: joi.array({
    id: joi.string().alphanum(),
    wID: joi.object({
        idValue: joi.string().alphanum()
    }),
    person: {
        governmentIDs: joi.array({itemID: joi.string().alphanum()}),
        legalName: joi.object({
            givenName: joi.string(),
            middleName: joi.string(),
            preferredSalutations: joi.array(
                {
                    salutationCode: {
                        longName: joi.string()
                    }

                }
            ),
            preferredName: joi.object().keys({
                FormattedName: joi.string()
            }),
        }),
        birthDate: joi.string().alphanum()
    }
})
}

这是我要发送的 json 对象:

{"workers" : [        
        {
          "id" : "",
          "wID" : {
            "idValue" : ""
          },
          "person" : {
            "governmentIDs":[{
                "itemID": "asd" 
            }],
            "legalName":{
              "givenName" : "PA",
              "middleName" : "",
              "preferredSalutations" : [{
                "salutationCode" : {
                  "longName" : ""
                    }
              }],
              "preferredName" : {
                "FormattedName" : ""
              },
              "birthDate" : ""
        }]
}

我在这里做错了什么?我什至试图在博客上关注一些东西,虽然示例显示了详细信息,但除了

"value must be an object"

它会正确地验证它,但是当它看到一个不合适的值时,它只会给出那个错误而不是其他任何东西。

此外,如果您查看“wID”部分,它有一个“idValue”对象,但当我去掉 idValue 并在 wID 键上放一个字母数字时,它也通过了验证。

ps。验证作为对象的键时。我是否必须使用

进行验证
key: Joi.object({
  a:Joi.string()
})

或者我可以这样做吗?:

key: {
  a:Joi.string()
}

非常感谢您的帮助!

【问题讨论】:

  • 您能否举一个您尝试验证的对象的示例,以便我们自己尝试并修改架构以适合?
  • 该对象不是有效的 JavaScript 对象。您缺少一些右 } 括号
  • var obj = { "workers" : [{ "id" : "", "wID" : { "idValue" : "" }, "person" : { "governmentIDs":[{ "itemID": "asd" }], "legalName":{ "givenName" : "PA", "middleName" : "", "preferredSalutations" : [{ "salutationCode" : { "longName" : "" } }], "preferredName" : { "FormattedName" : "" }, }, "birthDate" : "" } }] };

标签: node.js validation schema hapijs joi


【解决方案1】:

我认为有几个问题。首先,确保您验证的对象确实是带有workers 键的object。验证似乎表明您没有为此基值提供对象(可能是数组)?

在某些情况下,我认为您使用的 API 不正确(例如,joi.array(...) 无效)。我已经修改了您的架构,以按照我认为您的意图工作。如果没有,请发布示例对象,我会修改。

var schema = {
    workers: Joi.array().required().includes({
        id: Joi.string().alphanum(),
        wID: {
            idValue: Joi.string().alphanum()
        },
        person: {
            governmentIDs: Joi.array().includes(Joi.string().alphanum()),
            legalName: {
                givenName: Joi.string(),
                middleName: Joi.string(),
                preferredSalutations: Joi.array().includes(Joi.string()),
                preferredName: {
                    formattedName: Joi.string()
                },
            },
            birthDate: Joi.string().alphanum()
        }
    })
};

这是该架构的有效对象:

var goodExample = {
    workers: [
        {
            id: 'bhdsf78473',
            wID: {
                idValue: 'idvalue1'
            },
            person: {
                governmentIDs: ['id1', 'id2'],
                legalName: {
                    givenName: 'Johnny',
                    middleName: 'Michael',
                    preferredSalutations: ['sir', 'Dr'],
                    preferredName: {
                        formattedName: 'Sir Johnny Michael Smith'
                    }
                },
                birthDate: '2411986'
            }
        }
    ]
};

这是一个无效的:

var badExample = {
    workers: [
        {
            id: 'bhdsf7^£$%^£$%8473',   // Here's the issue
            wID: {
            },
            person: {
                governmentIDs: ['id1', 'id2'],
                legalName: {
                    givenName: 'Johnny',
                    middleName: 'Michael',
                    preferredSalutations: ['sir', 'Dr'],
                    preferredName: {
                        formattedName: 'Sir Johnny Michael Smith'
                    }
                },
                birthDate: '2411986'
            }
        }, 
    ], 
};

Joi 应该为Joi.assert(example, schema); 提供很好的详细输出:

$ node index.js

/.../node_modules/Joi/lib/index.js:121
            throw new Error(message + error.annotate());
                  ^
Error: {
  "workers": [
    {
      "wID": {},
      "person": {
        "governmentIDs": [
          "id1",
          "id2"
        ],
        "legalName": {
          "givenName": "Johnny",
          "middleName": "Michael",
          "preferredSalutations": [
            "sir",
            "Dr"
          ],
          "preferredName": {
            "formattedName": "Sir Johnny Michael Smith"
          }
        },
        "birthDate": "2411986"
      },
      "id" [1]: "bhdsf7^£$%^£$%8473"
    }
  ]
}

[1] workers at position 0 fails because id must only contain alpha-numeric characters
    at root.assert (/.../node_modules/Joi/lib/index.js:121:19)
    at Object.<anonymous> (/.../index.js:57:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:929:3

注意:此答案使用 Joi 5.1.2(API:https://github.com/hapijs/joi/blob/v5.1.0/README.md)。 Joi.array().includes() 将在下一个版本中删除,以支持 Joi.array().items()


您发布的对象不是有效的 JavaScript 对象,因为它缺少一些右 } 括号。这是有效的版本:

var obj = {
  "workers" : [{
    "id" : "",   // <-------- Shouldn't be empty
    "wID" : {
      "idValue" : ""
    },
    "person" : {
      "governmentIDs":[{
        "itemID": "asd" 
      }],
      "legalName":{
        "givenName" : "PA",
        "middleName" : "",
        "preferredSalutations" : [{
          "salutationCode" : {
            "longName" : ""
          }
        }],
        "preferredName" : {
          "FormattedName" : ""
        },
      },
      "birthDate" : ""
    }
  }]
};

如果我使用我提供的架构进行验证,我会收到以下消息(使用 Joi 5.1.0):

[1] workers at position 0 fails because id is not allowed to be empty

【讨论】:

  • 非常感谢您提供的详细信息!我添加了我的对象,有趣的是我永远无法得到那个详细的错误。无论我使用最简单的 json 结构将架构设置为什么。希望这个例子有帮助
  • 谢谢!!我终于注意到了我的错误,我没有 joi.array().REQUIRED().includes()... 但这是否会强制对象具有所有键的值??
  • @KoalaD 不,所需的不会级联。这只意味着根对象的workers 键必须包含一个数组。应该是哪个,对吧?
  • 是的,应该。我只是问,因为错误提到字段为空,但我所拥有的只是 Joi.string()。奇怪的是,它不会在所有键上出错,而​​是在某些键上出错。一旦我放了 required() ,它似乎就会级联下来......嗯
猜你喜欢
  • 2020-01-17
  • 2018-07-25
  • 2018-09-24
  • 1970-01-01
  • 2013-10-19
  • 2019-05-05
  • 2019-10-10
  • 2020-05-30
  • 2018-05-25
相关资源
最近更新 更多