用 Vite + React + Ky 联调后端:一个完整表单异常处理指南

🚀 用 Vite + React + Ky 联调后端:一个完整表单异常处理指南

场景

前端使用 Vite 构建,通过 Ky 发送请求:后端后端跑在 172.**.*.**:*****/serve

需求:

  1. 把用户填写的邮箱、姓名保存到后端;
  2. 网络异常业务异常超时 都要优雅提示;
  3. 代码结构清晰,方便日后复用。

1. 项目骨架速览

文件 职责
vite.config.ts 代理 /apihttp://172.**.*.**:*****/serve
src/api/index.ts Ky 封装通用 request 实例
WaitlistForm.tsx React 表单组件,负责校验 + 提交 + 异常处理

2. Vite 代理配置

ts 复制代码
// vite.config.ts
server: {
  proxy: {
    "/api": {
      target: "http://172.**.*.**:*****/serve",
      changeOrigin: true,
      rewrite: path => path.replace(/^\/api/, ""),
    },
  },
}
  • 本地 fetch('后端接口路径') 会被 Vite 转发到真实后端,无 CORS 烦恼。
  • 上线时把 /api 指向真正的域名即可,零改动

3. 用 Ky 封装请求

ts 复制代码
// src/api/index.ts
import ky from 'ky';

const request = ky.create({
  prefixUrl: '/api',   // 自动拼接
  timeout: 600_000,    // 10 min,可按需调整
});

export async function form(data: any) {
  return request.post('后端接口路径', data);
}
  • prefixUrl 让后续路径保持简洁。
  • Ky 自带 timeout / retry / 错误处理 中间件,比原生 fetch 更顺手。

4. React 表单核心逻辑

4.1 状态设计

ts 复制代码
const [formData, setFormData] = useState({
  email: "",
  firstName: "",
  lastName: "",
});
const [submitted, setSubmitted] = useState(false);
const [error, setError] = useState("");

4.2 前端校验

  • 必填字段、邮箱格式、长度 ≤ 50 字符。
  • 早失败:前端先挡一波,减少无效请求。
ts 复制代码
if (!isValidEmail(formData.email)) {
  setError("Please enter a valid email address.");
  return;
}

4.3 提交 & 异常处理

ts 复制代码
try {
  // 1️⃣ 发送
  const response = await form({
    json: {
      email: formData.email,
      firstName: formData.firstName,
      lastName: formData.lastName,
    },
  });

  // 2️⃣ 网络层检查(HTTP 状态码)
  if (!response.ok) {
    throw new Error("Network error. Please check your connection.");
  }

  // 3️⃣ 业务层检查(后端返回 success=false)
  const data: { success?: boolean; msg?: string } = await response.json();
  if (data?.success === false) {
    throw new Error(data.msg || "Submission failed. Please try again later.");
  }

  // 4️⃣ 成功
  setSubmitted(true);
  setFormData({ email: "", firstName: "", lastName: "" });
} catch (error: any) {
  // 5️⃣ 统一收口
  setError(error?.message || "Submission failed. Please try again later.");
}

异常分层

类型 触发示例 最终提示
网络错误 断网、502 "Network error. Please check your connection."
业务错误 {success:false, msg:"邮箱已存在"} "邮箱已存在"
超时 Ky 自带 "Submission failed...(或配置 Ky timeout 提示)
JSON 解析 后端返回 HTML 同上兜底

5. 小技巧 & 踩坑

  1. 后端返回非 JSON

    在 catch 内统一 error.message 兜底即可,用户不会看到晦涩的 Unexpected token <

  2. 代理只在 dev 生效

    打包后把 /api 指向生产域名,或使用环境变量切换。

  3. 调试代理
    vite --debug 或浏览器 Network 面板观察实际转发路径。


6. 总结

  • Vite 代理 解决本地跨域。
  • Ky 比 fetch 更友好,自带 timeout、retry。
  • 异常分层 :HTTP → 业务 → 兜底,全部收敛到 catch,前端提示清晰。
  • 零配置切换:dev 用代理,prod 用真实域名,一行代码都不用改。

把这段逻辑沉淀为 hooks封装函数,以后任何表单都能直接复用。Happy coding!

相关推荐
用户21496515898752 分钟前
从零搭建uniapp环境-记录
前端
努力写代码的熊大2 小时前
stack、queue与priority_queue的用法解析与模拟实现
java·前端·javascript
im_AMBER2 小时前
React 06
前端·javascript·笔记·学习·react.js·前端框架
wyzqhhhh2 小时前
前端常见的设计模式
前端·设计模式
IT_陈寒2 小时前
React 19重磅前瞻:10个性能优化技巧让你少写30%的useEffect代码
前端·人工智能·后端
今天没有盐3 小时前
💕CSS 基础入门指南💕:选择器与文本样式
前端·html·响应式设计
云枫晖3 小时前
Webpack系列-Entry入口
前端·webpack
mustfeng4 小时前
VCS & Verdi 2023安装
java·服务器·前端
Mintopia4 小时前
🌐 数据合规框架下的 WebAIGC 训练数据处理技术规范
前端·javascript·aigc
骥龙4 小时前
2.6、Web漏洞挖掘实战(下):XSS、文件上传与逻辑漏洞深度解析
前端·xss