我的模式是:
const scenerioSchema = Joi.object({
drawingNode: Joi.object({
moduleRackOutputs: Joi.array()
.items(
Joi.object({
moduleId: Joi.string().required()
})
)
.unique((a, b) => a.moduleId !== b.moduleId)
})
})
我的数据是:
const mockScenario1 = {
drawingNode: {
moduleRackOutputs: [
{
moduleId: 'module1'
},
{
moduleId: 'module2'
}
]
}
}
当我使用进行验证时
const validationResponse = scenerioSchema.validate(mockScenario1)
我得到:
{
validationResponse: {
value: { drawingNode: [Object] },
error: [Error [ValidationError]: "drawingNode.moduleRackOutputs[1]" contains a duplicate value] {
_original: [Object],
details: [Array]
}
}
}
但(a(这不是真的——这些项目不是重复的,(b(如果moduleId
不同,我希望发生错误。
我做错了什么?
解决方案
正如@Ankh所建议的,
问题的解决方案是用===
替换!==
。
为什么这是解决方案
当你做!==
时,你基本上告诉Joi的是:
"所有数组元素都必须具有SAME唯一键"下面是一些可以通过的示例数据:
// Example 1: would pass!
const arr = [ { moduleId: 0 } ];
// Example 2: would pass!
const arr = [ { moduleId: 0 } , { moduleId: 0 }]
// Example 3: would pass!
const arr = [ { moduleId: 0 } , { moduleId: 0 }, { moduleId: 0 }] // and so on...
然而,以下示例将失败:
// Example 4: would fail...
const arr = [ { moduleId: 0 }, { moduleId: 1 } ];
// Example 5: would fail...
const arr = [ { moduleId: 1 } , { moduleId: 2 } , { moduleId: 3 }]
// Example 6: would fail...
const arr = [ { moduleId: 1 } , { moduleId: 1 } , { moduleId: 2 }]
这是因为Joi运行"独特的">针对阵列中的所有其他项目的验证,并说:";每当我看到一个元素j是!==时,我都会声明DUPLICATE对于元素i〃;,而你想要的恰恰相反。