Thiết lập Mock API trong Dự án Vue với Mock.js và Axios

Để phát triển frontend độc lập mà không phụ thuộc vào backend, việc mô phỏng dữ liệu API là một kỹ thuật thiết yếu. Bài viết này trình bày cách tích hợp Mock.js vào dự án Vue (phiên bản CLI 4/5) kết hợp với axios để giả lập các endpoint HTTP như GET và POST.

1. Khởi tạo dự án

Sử dụng giao diện đồ họa Vue CLI để tạo dự án mới:

vue ui

Sau đó chọn các tùy chọn phù hợp qua wizard — không cần cấu hình đặc biệt nào khác.

2. Cài đặt thư viện hỗ trợ

Chạy lệnh sau để cài đặt axiosmockjs:

npm install axios mockjs

Kiểm tra phiên bản trong package.json:

"axios": "^1.6.0",
"mockjs": "^1.1.0"

3. Thiết kế lớp yêu cầu HTTP (api.ts)

Tạo file src/utils/api.ts với logic xử lý request/response và wrapper cho các phương thức phổ biến:

import axios from 'axios';

// Thiết lập header mặc định cho POST
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

// Interceptor yêu cầu
axios.interceptors.request.use(
  config => config,
  error => Promise.reject(error)
);

// Interceptor phản hồi
axios.interceptors.response.use(
  response => response.data,
  error => Promise.reject(error)
);

export const httpPost = <T>(url: string, data?: any): Promise<T> => 
  axios.post(url, data).then(res => res.data);

export const httpGet = <T>(url: string, params?: any): Promise<T> => 
  axios.get(url, { params }).then(res => res.data);

export default {
  post: httpPost,
  get: httpGet
};

4. Triển khai mock server cục bộ (mock/index.ts)

Tạo thư mục src/mock/, sau đó thêm file index.ts:

import Mock from 'mockjs';
import { UserList } from './data/user'; // Dữ liệu mẫu được tách riêng

// Hàm sinh dữ liệu tin tức ngẫu nhiên
const generateNewsFeed = () => {
  const list = [];
  for (let i = 0; i < 50; i++) {
    list.push({
      id: Mock.Random.guid(),
      headline: Mock.Random.cparagraph(1, 3),
      coverUrl: Mock.Random.dataImage('400x300', 'Ảnh minh họa'),
      author: Mock.Random.cname(),
      publishedAt: `${Mock.Random.date('yyyy-MM-dd')} ${Mock.Random.time('HH:mm:ss')}`
    });
  }
  return { code: 200, data: list };
};

// Đăng ký các route giả lập
Mock.mock('/api/news/feed', 'post', generateNewsFeed);
Mock.mock('/api/news/feed', 'get', { code: 200, message: 'OK' });
Mock.mock('/api/users/list', 'get', () => ({ code: 200, data: UserList }));

File src/mock/data/user.ts chứa dữ liệu tĩnh dạng object:

export const UserList = [
  { id: 1, name: 'Nguyễn Văn A', role: 'admin', email: 'a@example.com' },
  { id: 2, name: 'Trần Thị B', role: 'editor', email: 'b@example.com' }
];

5. Kích hoạt mock trong ứng dụng

Mở src/main.ts và thêm dòng import ở đầu file:

// Kích hoạt mock chỉ trong môi trường dev
if (process.env.NODE_ENV === 'development') {
  require('@/mock/index.ts');
}

6. Sử dụng trong component Vue

Ví dụ trong HomeView.vue:

<script setup lang="ts">
import api from '@/utils/api';

const fetchNews = async () => {
  try {
    const result = await api.post<any>('/api/news/feed', { category: 'tech' });
    console.log('Danh sách tin:', result.data);
  } catch (err) {
    console.error('Lỗi khi gọi API:', err);
  }
};

const fetchUsers = async () => {
  const users = await api.get<{ data: any[] }>('/api/users/list');
  console.log('Danh sách người dùng:', users.data);
};

fetchNews();
fetchUsers();
</script>

7. Tắt ESLint strict mode (tùy chọn)

Nếu muốn giảm mức độ nghiêm ngặt của kiểm tra mã, tạo file vue.config.js ở gốc dự án:

module.exports = {
  lintOnSave: false,
  devServer: {
    client: {
      overlay: false
    }
  }
};

Thẻ: vuejs MockJS Axios frontend-testing api-mocking

Đăng vào ngày 28 tháng 5 lúc 09:32