返回

防止Yup验证中的额外键:详尽指南

javascript

## 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');

### 使用 strictstripUnknown 选项

Yup 还提供了 strictstripUnknown 选项,可以进一步控制如何处理额外键:

  • strict: 严格验证模式,在检测到任何错误(包括未知键)时停止验证。
  • stripUnknown: 从验证对象中删除未知键,但不会阻止 Yup 在检测到未知键时引发错误。

你可以结合使用这两个选项来满足你的特定需求。例如:

schema.validateSync(data, { strict: true, stripUnknown: true });

### 结论

通过使用上述方法,你可以确保 Yup 在收到额外键时引发验证错误。这将帮助你编写更健壮和可信赖的验证代码。

### 常见问题解答

1. 为什么 Yup 默认情况下会忽略额外键?

为了避免在处理复杂对象时遇到不必要的错误。

2. noUnknown 和自定义验证规则有什么区别?

noUnknown 是 Yup 提供的便捷方法,而自定义验证规则提供了更多灵活性。

3. 何时应该使用 strictstripUnknown 选项?

strict 适用于严格验证,而 stripUnknown 适用于需要删除未知键的情况。

4. 这些方法是否有任何缺点?

更严格的验证可能导致开发过程中出现更多错误,而删除未知键可能会丢失重要数据。

5. 我可以在哪里找到更多关于 Yup 验证的信息?

请访问 Yup 文档:https://github.com/jquense/yup