描述性 Hapi/Joi 验证错误
Descriptive Hapi/Joi validation error
我一直在尝试在我们的节点应用程序中实现 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()
}
非常感谢您的帮助!
我认为有几个问题。首先,确保您要验证的对象确实是带有 workers
键的 object
。验证似乎表明您没有为此基值提供对象(也许是数组)?
此外,在某些情况下,我认为您使用的 API 不正确(例如 joi.array(...)
无效)。我已经修改了您的模式以按照我认为的方式工作。如果没有,post一个示例对象,我会修改。
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()
您 post 编辑的对象不是有效的 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
我一直在尝试在我们的节点应用程序中实现 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()
}
非常感谢您的帮助!
我认为有几个问题。首先,确保您要验证的对象确实是带有 workers
键的 object
。验证似乎表明您没有为此基值提供对象(也许是数组)?
此外,在某些情况下,我认为您使用的 API 不正确(例如 joi.array(...)
无效)。我已经修改了您的模式以按照我认为的方式工作。如果没有,post一个示例对象,我会修改。
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()
您 post 编辑的对象不是有效的 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