跳转到内容

故障排查

本章节帮助你解决在使用 vite-plugin-mock-dev-server 过程中遇到的常见问题。

快速诊断清单

遇到问题时,请按以下顺序检查:

  1. ✅ 插件是否正确安装
  2. vite.config.ts 中是否正确配置
  3. ✅ Mock 文件是否在正确的目录
  4. ✅ 开发服务器是否已重启
  5. ✅ 请求路径是否匹配

常见问题

Mock API 没有响应

症状

请求 Mock API 时返回 404 或没有响应。

可能原因及解决方案

1. 插件未正确加载

检查 vite.config.ts

ts
import { defineConfig } from 'vite'
import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server'

export default defineConfig({
  plugins: [
    // 确保插件已添加
    mockDevServerPlugin()
  ],
  // 确保代理配置正确
  server: {
    proxy: {
      // 插件读取 proxy 配置,匹配 /api 开头的请求
      '/api': 'http://example.com'
    }
  }
})

2. Mock 文件位置错误

默认情况下,插件会查找 mock 目录下的文件:

project-root/
├── mock/                 # Mock 文件目录
│   ├── api.mock.ts
│   └── users.mock.ts
├── src/
└── vite.config.ts

如果使用了自定义目录:

ts
mockDevServerPlugin({
  dir: 'my-mock-folder' // 确保目录存在
})

3. 文件扩展名不匹配

默认只识别以下扩展名:

  • .mock.js
  • .mock.ts
  • .mock.cjs
  • .mock.mjs
  • .mock.json
  • .mock.json5

4. 开发服务器未重启

修改 vite.config.ts 后需要重启开发服务器。

热更新不生效

症状

修改 Mock 文件后,数据没有更新。

解决方案

1. 检查文件是否被监听

开启调试日志查看文件监听状态:

ts
mockDevServerPlugin({
  log: 'debug'
})

2. 检查文件路径

确保修改的文件在配置的 include 范围内:

ts
mockDevServerPlugin({
  include: ['**/*.mock.ts'], // 确保你的文件匹配这个模式
  exclude: ['**/node_modules/**', '**/*.test.mock.ts'] // 确保没有被排除
})

3. 启用页面刷新

热更新仅更新服务端数据,浏览器需要刷新才能看到更新。可以启用热更新时自动刷新浏览器页面:

ts
mockDevServerPlugin({
  reload: true // 修改 Mock 文件后刷新页面
})

路径匹配失败

症状

请求路径与 Mock 配置不匹配。

调试方法

1. 开启调试日志

ts
mockDevServerPlugin({
  log: 'debug'
})

查看控制台输出。

2. 检查路径格式

常见错误:

ts
// ❌ 错误:缺少前导斜杠
export default defineMock({
  url: 'api/users' // 应该是 '/api/users'
})

// ❌ 错误:尾部斜杠不一致
// Mock 配置
url: '/api/users'
// 实际请求
fetch('/api/users/') // 不匹配!

// ✅ 正确
url: '/api/users'
fetch('/api/users') // 匹配

3. 检查前缀配置

如果使用 prefix 配置,确保请求路径以 prefix 开头:

ts
mockDevServerPlugin({
  prefix: ['/api'] // 只拦截 /api 开头的请求
})

// ✅ 会被拦截
fetch('/api/users')

// ❌ 不会被拦截
fetch('/mock/users')

WebSocket 连接失败

症状

WebSocket 连接无法建立或立即断开。

解决方案

1. 检查 WebSocket 前缀配置

ts
mockDevServerPlugin({
  wsPrefix: ['/ws', '/socket.io'] // WebSocket 路径前缀
})

2. 确保没有在 Vite 代理中配置相同路径

ts
// vite.config.ts
export default defineConfig({
  server: {
    proxy: {
      // ❌ 错误:WebSocket 路径不应该在这里配置
      '/ws': 'http://localhost:8080'
    }
  },
  plugins: [
    mockDevServerPlugin({
      wsPrefix: ['/ws'] // 应该只在这里配置
    })
  ]
})

3. 检查 WebSocket URL 格式

js
// ✅ 正确
const socket = new WebSocket('ws://localhost:5173/ws/chat')

// ❌ 错误:使用了 http 协议
const wrongSocket = new WebSocket('http://localhost:5173/ws/chat')

症状

设置的 Cookie 在浏览器中看不到。

解决方案

1. 检查 Cookie 配置

ts
export default defineMock({
  url: '/api/login',
  cookies: {
    // ✅ 正确:设置 Cookie
    session: ['abc123', {
      httpOnly: true,
      maxAge: 24 * 60 * 60 * 1000 // 24小时,单位是毫秒
    }]
  }
})

2. 检查浏览器安全限制

  • Secure 标志要求 HTTPS
  • SameSite=Strict 可能阻止跨站请求
  • HttpOnly 的 Cookie 在 JavaScript 中不可见

3. 检查请求是否跨域

如果前端和 Mock 服务跨域,需要配置 CORS:

ts
mockDevServerPlugin({
  cors: true // 或详细配置
})

文件上传失败

症状

上传文件时返回 413 或无法解析文件。

解决方案

1. 配置文件大小限制

ts
mockDevServerPlugin({
  formidableOptions: {
    maxFileSize: 10 * 1024 * 1024, // 10MB,默认 5MB
    maxFieldsSize: 10 * 1024 * 1024
  }
})

2. 检查文件保存路径

ts
import path from 'node:path'

mockDevServerPlugin({
  formidableOptions: {
    uploadDir: path.join(process.cwd(), 'uploads'), // 确保目录存在
    keepExtensions: true // 保留文件扩展名
  }
})

3. 检查请求 Content-Type

确保请求头包含正确的 Content-Type:

txt
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

请求体解析失败

症状

无法获取请求体数据或数据格式错误。

解决方案

1. 检查 Content-Type

ts
// 确保请求发送了正确的 Content-Type
fetch('/api/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json' // 默认为 json 格式,其他格式需指定
  },
  body: JSON.stringify({ name: 'John' })
})

2. 配置请求体大小限制

ts
mockDevServerPlugin({
  bodyParserOptions: {
    jsonLimit: '10mb', // JSON 请求体大小限制
    formLimit: '10mb', // Form 请求体大小限制
    textLimit: '10mb' // Text 请求体大小限制
  }
})

3. 检查请求体格式

ts
export default defineMock({
  url: '/api/users',
  method: 'POST',
  body: (request) => {
    console.log('Request body:', request.body) // 调试用
    return { received: request.body }
  }
})

与后端 API 冲突

症状

Mock API 和真实后端 API 同时存在时发生冲突。

解决方案

配置 Vite 代理

ts
export default defineConfig({
  plugins: [mockDevServerPlugin({ prefix: ['/api'] })],
  server: {
    proxy: {
      // 未匹配到 Mock 的请求转发到后端
      '^/api': {
        target: 'http://localhost:8080',
        changeOrigin: true
      }
    }
  }
})

调试技巧

开启详细日志

ts
mockDevServerPlugin({
  log: 'debug' // 'debug' | 'info' | 'warn' | 'error' | 'silent'
})

检查请求详情

ts
export default defineMock({
  url: '/api/debug',
  body: request => ({
    // 查看完整请求信息
    method: request.method,
    url: request.url,
    query: request.query,
    params: request.params,
    body: request.body,
    headers: request.headers,
    cookies: request.getCookie('session')
  })
})

使用浏览器开发者工具

  1. Network 面板: 查看请求和响应详情
  2. Console 面板: 查看插件日志输出
  3. Application 面板: 查看 Cookies 和 LocalStorage

获取帮助

如果以上方法都无法解决你的问题:

  1. 查看文档: 仔细阅读相关功能的使用文档
  2. 搜索 Issues: 在 GitHub Issues 中搜索类似问题
  3. 提交 Issue: 如果确认是 bug,请提交 Issue 并提供:
    • 插件版本
    • Vite 版本
    • Node.js 版本
    • 最小可复现示例
    • 错误日志

已知限制

  1. 某些中间件不兼容: 与某些 Vite 插件可能存在冲突

基于 MIT 许可发布