描述性 Hapi/Joi 验证错误

Koa*_*laD 5 validation schema node.js joi hapi.js

我一直在尝试在我们的节点应用程序中实现 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:.....
Run Code Online (Sandbox Code Playgroud)

我从来没有得到关于哪个键失败的具体信息以及失败原因的描述。

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

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()
    }
})
}
Run Code Online (Sandbox Code Playgroud)

这是我要发送的 json 对象:

{"workers" : [        
        {
          "id" : "",
          "wID" : {
            "idValue" : ""
          },
          "person" : {
            "governmentIDs":[{
                "itemID": "asd" 
            }],
            "legalName":{
              "givenName" : "PA",
              "middleName" : "",
              "preferredSalutations" : [{
                "salutationCode" : {
                  "longName" : ""
                    }
              }],
              "preferredName" : {
                "FormattedName" : ""
              },
              "birthDate" : ""
        }]
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?我什至尝试关注博客上的一些内容,虽然示例显示了详细信息,但除了这些之外我什么也没得到

"value must be an object"
Run Code Online (Sandbox Code Playgroud)

它会正确验证它,但当它看到不合适的值时,它只会给出该错误,而不会给出任何其他内容。

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

附:验证作为对象的键时。我必须验证它吗

key: Joi.object({
  a:Joi.string()
})
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做吗?:

key: {
  a:Joi.string()
}
Run Code Online (Sandbox Code Playgroud)

十分感谢你的帮助!

Mat*_*son 4

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

\n\n

另外,在某些情况下,我认为您错误地使用了 API(例如joi.array(...)无效)。我已经修改了您的架构,以按照我认为您的预期方式工作。如果没有,请发布示例对象,我将进行修改。

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

这是该模式的有效对象:

\n\n
var goodExample = {\n    workers: [\n        {\n            id: \'bhdsf78473\',\n            wID: {\n                idValue: \'idvalue1\'\n            },\n            person: {\n                governmentIDs: [\'id1\', \'id2\'],\n                legalName: {\n                    givenName: \'Johnny\',\n                    middleName: \'Michael\',\n                    preferredSalutations: [\'sir\', \'Dr\'],\n                    preferredName: {\n                        formattedName: \'Sir Johnny Michael Smith\'\n                    }\n                },\n                birthDate: \'2411986\'\n            }\n        }\n    ]\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个无效的:

\n\n
var badExample = {\n    workers: [\n        {\n            id: \'bhdsf7^\xc2\xa3$%^\xc2\xa3$%8473\',   // Here\'s the issue\n            wID: {\n            },\n            person: {\n                governmentIDs: [\'id1\', \'id2\'],\n                legalName: {\n                    givenName: \'Johnny\',\n                    middleName: \'Michael\',\n                    preferredSalutations: [\'sir\', \'Dr\'],\n                    preferredName: {\n                        formattedName: \'Sir Johnny Michael Smith\'\n                    }\n                },\n                birthDate: \'2411986\'\n            }\n        }, \n    ], \n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

Joi 应该为以下内容提供详细的输出Joi.assert(example, schema);

\n\n
$ node index.js\n\n/.../node_modules/Joi/lib/index.js:121\n            throw new Error(message + error.annotate());\n                  ^\nError: {\n  "workers": [\n    {\n      "wID": {},\n      "person": {\n        "governmentIDs": [\n          "id1",\n          "id2"\n        ],\n        "legalName": {\n          "givenName": "Johnny",\n          "middleName": "Michael",\n          "preferredSalutations": [\n            "sir",\n            "Dr"\n          ],\n          "preferredName": {\n            "formattedName": "Sir Johnny Michael Smith"\n          }\n        },\n        "birthDate": "2411986"\n      },\n      "id" [1]: "bhdsf7^\xc2\xa3$%^\xc2\xa3$%8473"\n    }\n  ]\n}\n\n[1] workers at position 0 fails because id must only contain alpha-numeric characters\n    at root.assert (/.../node_modules/Joi/lib/index.js:121:19)\n    at Object.<anonymous> (/.../index.js:57:5)\n    at Module._compile (module.js:456:26)\n    at Object.Module._extensions..js (module.js:474:10)\n    at Module.load (module.js:356:32)\n    at Function.Module._load (module.js:312:12)\n    at Function.Module.runMain (module.js:497:10)\n    at startup (node.js:119:16)\n    at node.js:929:3\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

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

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

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

\n\n
[1] workers at position 0 fails because id is not allowed to be empty\n
Run Code Online (Sandbox Code Playgroud)\n