防止Yup验证中的额外键:详尽指南
2024-03-22 15:01:46
## Yup 验证中的额外键:解决和预防
作为一名经验丰富的程序员,我经常使用 Yup 来验证数据对象。不过,我也曾遇到过 Yup 在收到对象中包含的额外键时验证成功的情况。这让我感到困惑,因为我知道 Yup 应该只允许验证模式中定义的键。
经过一番研究,我了解到 Yup 在默认情况下会忽略模式中未定义的额外键。这可能导致意外的行为,尤其是当这些额外键携带重要数据或包含错误信息时。为了解决这个问题,你可以采取以下方法:
### 明确声明模式类型
Yup 提供了 noUnknown
方法,它可以显式声明你的模式只允许模式中定义的键。使用此方法,当 Yup 检测到额外键时,它会引发错误。例如:
const schema = yup.object().noUnknown().shape({
name: yup.string().required(),
});
### 自定义验证规则
另一种方法是创建自定义验证规则,用于检查对象是否包含任何模式中未定义的键。以下是实现此规则的步骤:
const noUnknownKeys = yup
.mixed()
.test('noUnknownKeys', 'Contains unknown keys', (value) => {
if (!value) return true;
const keys = Object.keys(value);
return keys.every((key) => schema.fields[key]);
});
然后,你可以将此规则添加到模式中:
const schema = yup.object().shape({
name: yup.string().required(),
desc: yup.string(),
}).test('noUnknownKeys');
### 使用 strict
和 stripUnknown
选项
Yup 还提供了 strict
和 stripUnknown
选项,可以进一步控制如何处理额外键:
strict
: 严格验证模式,在检测到任何错误(包括未知键)时停止验证。stripUnknown
: 从验证对象中删除未知键,但不会阻止 Yup 在检测到未知键时引发错误。
你可以结合使用这两个选项来满足你的特定需求。例如:
schema.validateSync(data, { strict: true, stripUnknown: true });
### 结论
通过使用上述方法,你可以确保 Yup 在收到额外键时引发验证错误。这将帮助你编写更健壮和可信赖的验证代码。
### 常见问题解答
1. 为什么 Yup 默认情况下会忽略额外键?
为了避免在处理复杂对象时遇到不必要的错误。
2. noUnknown
和自定义验证规则有什么区别?
noUnknown
是 Yup 提供的便捷方法,而自定义验证规则提供了更多灵活性。
3. 何时应该使用 strict
和 stripUnknown
选项?
strict
适用于严格验证,而 stripUnknown
适用于需要删除未知键的情况。
4. 这些方法是否有任何缺点?
更严格的验证可能导致开发过程中出现更多错误,而删除未知键可能会丢失重要数据。
5. 我可以在哪里找到更多关于 Yup 验证的信息?
请访问 Yup 文档:https://github.com/jquense/yup