You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fastify中结合Yup返回{字段名:错误信息}格式的验证错误

Yup验证返回具体字段错误信息的实现方法

要返回{field1: message, field2: message}格式的验证错误,核心是利用Yup错误对象的inner属性,结合abortEarly: false配置获取所有字段的错误详情,具体步骤如下:

1. 确保启用abortEarly: false

这是获取所有错误的前提,该配置会让Yup不中断验证流程,收集所有字段的错误信息,而非仅返回第一个错误。

2. 捕获错误并转换格式

使用Yup的validate(异步)或validateSync(同步)方法验证表单数据,捕获错误后,遍历错误对象的inner数组,将字段名与对应错误信息映射为目标格式。

代码示例

定义验证Schema

import * as Yup from 'yup';

const formSchema = Yup.object().shape({
  username: Yup.string().required('用户名不能为空').min(6, '用户名长度不能少于6位'),
  password: Yup.string().required('密码不能为空').matches(/^[A-Za-z0-9]+$/, '密码只能包含字母和数字'),
});

异步验证实现

async function validateForm(formData) {
  try {
    await formSchema.validate(formData, { abortEarly: false });
    return {}; // 验证通过返回空对象
  } catch (error) {
    const errorMap = {};
    error.inner.forEach(err => {
      // 若字段已有错误,此处选择保留第一个错误,可按需调整为合并逻辑
      if (!errorMap[err.path]) {
        errorMap[err.path] = err.message;
      }
    });
    return errorMap;
  }
}

同步验证实现

function validateFormSync(formData) {
  try {
    formSchema.validateSync(formData, { abortEarly: false });
    return {};
  } catch (error) {
    const errorMap = {};
    error.inner.forEach(err => {
      if (!errorMap[err.path]) {
        errorMap[err.path] = err.message;
      }
    });
    return errorMap;
  }
}

3. 处理多错误场景(可选)

如果同一个字段触发多个验证规则(比如同时满足required和min),可以合并错误信息:

error.inner.forEach(err => {
  if (errorMap[err.path]) {
    errorMap[err.path] += ';' + err.message;
  } else {
    errorMap[err.path] = err.message;
  }
});

内容的提问来源于stack exchange,提问作者cs.edoardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:24:53