javascript模拟表单校验失败需返回400响应及errors字段,常用msw拦截请求并返回结构化错误,或用axios自定义adapter、json server实现轻量mock。

在 JavaScript 中模拟表单校验失败的错误响应,核心是让接口请求返回符合后端错误格式的响应体(如 400 状态码 + 错误字段信息),而不是真实调用后端。常用方式是借助 Mock 工具拦截请求并动态返回错误数据。
使用 Mock Service Worker(MSW)返回校验失败响应
MSW 是目前主流的前端 Mock 方案,支持浏览器和 Node 环境,能精准拦截 fetch / XMLHttpRequest 请求。
- 安装依赖:
npm install msw --save-dev - 定义一个失败的登录接口响应:
// mocks/handlers.js
import { rest } from 'msw'
export const handlers = [
rest.post('/api/login', (req, res, ctx) => {
// 模拟表单校验失败:邮箱格式不对、密码太短
return res(
ctx.status(400),
ctx.json({
code: 400,
message: '表单校验失败',
errors: {
email: ['邮箱格式不正确'],
password: ['密码长度不能少于6位']
}
})
)
})
]
在测试或开发中启用 MSW 后,前端调用 fetch('/api/login', {...}) 就会收到这个结构化错误响应,可直接用于展示表单下方的错误提示。
使用 Axios + 自定义 adapter 拦截(轻量级方案)
若项目未引入 MSW,又想快速 Mock,可临时改写 Axios 的 adapter,在开发环境返回模拟错误。
- 判断当前是否为 mock 模式(例如通过 URL 参数或环境变量)
- 对特定接口(如
/api/submit)返回 Promise.reject 包裹的错误响应
// 开发环境下启用 mock adapter
if (process.env.NODE_ENV === 'development' && location.search.includes('mock')) {
axios.defaults.adapter = function(config) {
if (config.url === '/api/submit' && config.method === 'post') {
return Promise.reject({
response: {
status: 400,
data: {
errors: {
username: ['用户名已存在'],
phone: ['手机号已被注册']
}
}
}
})
}
return axios.defaults.adapter(config)
}
}
在组件中统一处理校验错误并渲染
拿到 Mock 返回的错误后,需解析 errors 字段,映射到对应表单项。常见做法:
- 用对象存储各字段错误信息,例如
const [fieldErrors, setFieldErrors] = useState({}) - 提交失败时,将响应中的
errors直接设为 state - 表单项旁用
{fieldErrors.email?.[0]}渲染第一条错误提示
注意:确保后端约定的 errors 结构与前端字段名一致(如后端返回 email,表单字段 name 也应为 email),否则需做字段映射。
补充:用 JSON Server 快速起一个带校验逻辑的 Mock API
适合需要多接口、简单规则的场景。配合中间件模拟校验失败:
- 安装:
npm install -g json-server - 创建
server.js,监听 POST 并手动校验:
const jsonServer = require('json-server')
const server = jsonServer.create()
const middlewares = jsonServer.defaults()
server.use(middlewares)
server.post('/api/register', (req, res) => {
const { email, password } = req.body
const errors = {}
if (!/^\S+@\S+\.\S+$/.test(email)) {
errors.email = ['邮箱格式不正确']
}
if (password?.length 0) {
return res.status(400).json({ errors })
}
res.status(201).json({ message: '注册成功' })
})
server.listen(3001)
启动后访问 http://localhost:3001/api/register 即可触发校验逻辑,前端无需修改请求方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











