为什么 Joi 用 "contains a duplicate value" 验证对象数组?



我的模式是:

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〃;,而你想要的恰恰相反。

相关内容

  • 没有找到相关文章