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)
十分感谢你的帮助!
我认为有几个问题。首先,确保您要验证的对象确实是object带有workers密钥的对象。验证似乎表明您没有为此基值提供对象(可能是一个数组)?
另外,在某些情况下,我认为您错误地使用了 API(例如joi.array(...)无效)。我已经修改了您的架构,以按照我认为您的预期方式工作。如果没有,请发布示例对象,我将进行修改。
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};\nRun Code Online (Sandbox Code Playgroud)\n\n这是该模式的有效对象:
\n\nvar 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};\nRun Code Online (Sandbox Code Playgroud)\n\n这是一个无效的:
\n\nvar 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};\nRun Code Online (Sandbox Code Playgroud)\n\nJoi 应该为以下内容提供详细的输出Joi.assert(example, schema);:
$ 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\nRun 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()
您发布的对象不是有效的 JavaScript 对象,因为它缺少一些右括号。这是有效版本:
\n\nvar 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};\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
14968 次 |
| 最近记录: |