MockServer 遷移指南

APIGit

2023-11-14

APIGIT MockServer Migration Guide

介紹

2024 年 11 月 9 日,APIGIT 正式發布了新版本的 MockServer 後端,由 Express.js 並在 Node.js 沙盒環境中運行。此版本帶來了改進的功能、增強的靈活性以及更強大的定義模擬伺服器行為的方法。然而,從舊版本(純粹基於 JavaScript)過渡到新版本需要解決一些問題 重大變化

本指南將幫助您了解這些變化,調整您現有的模擬伺服器項目,並確保無縫遷移到新的 MockServer。

主要變化和遷移細節

與舊版相比,新版 MockServer 引入了一些重大變更。意識到這些變化並相應地調整您的專案非常重要。

1. 模擬伺服器的 URL 更改

舊 URL 格式your-mockserver.mock.apigit.com

新的 URL 格式your-mockserver.mockserver.apigit.com

如果你有 未重新發布 自從新的 MockServer 啟動以來,舊的模擬伺服器將 繼續工作到年底。然而,如果你決定 重新發布 您的模擬伺服器使用相同的模擬伺服器名稱,您將需要更新任何現有參考以反映新的 URL 結構。

您需要做什麼:

  • 如果你的模擬伺服器仍在使用舊的 URL,則無需立即進行更改,它將保持運行,直到 2024 年 12 月 31 日
  • 如果你 重新發布 您的模擬伺服器,請確保應用程式中的所有端點、配置和引用都已更新以使用模擬伺服器的新 URL。

例子

  • 舊網址: https://your-mockserver.mock.apigit.com/endpoint
  • 新網址: https://your-mockserver.mockserver.apigit.com/endpoint

請務必更新客戶端應用程式、文件和整合中的所有引用。

2. 庫導入 - 不再有全域庫變量

在舊的 MockServer 中,幾個流行的 JavaScript 庫是全域可用的,允許直接使用而無需明確導入。其中包括:

  • lodash(_ (v4.17.21) - 通用實用功能
  • momentjs(moment (v2.30.1) - 時間和日期處理
  • 偽造者(faker (v5.5.3)- 資料產生器
  • ajv (Ajv (v6.10.0)- JSON 模式驗證
  • 驗證器(validator (v13.12.0)- 驗證助手

在新版的 MockServer 中,這些函式庫現在必須 手動導入 使用 require 或者 import 使用前,請在模擬腳本中聲明。

您需要做什麼:

  • 添加適當的 require 或者 import 模擬腳本中使用的任何受支援庫的語句。

新 MockServer 中支援的函式庫

新的 MockServer 預先安裝了流行的 JavaScript 函式庫。以下是受支援的庫的列表及其使用方法的範例:

  • @faker-js/faker (v9.2.0)- 資料產生器
  • 平均 (v8.17.1)- JSON 模式驗證
  • base64-js (v1.5.1)-Base64 編碼/解碼
  • cors (v2.8.5) - 跨源資源共享中間件
  • jsonwebtoken (v9.0.2)- JWT 創建和驗證
  • lodash (v4.17.21)- 通用實用程序
  • 片刻 (v2.30.1) - 時間和日期處理
  • 唯一識別 (v11.0.3) - UUID 生成器
  • 驗證器 (v13.12.0)- 驗證助手

範例用法

var moment = require('moment'); // require
const { faker } = require('@faker-js/faker');
const Ajv = require("ajv");
var validator = require('validator');
const base64 = require('base64-js');
const jwt = require('jsonwebtoken');
const { v4: uuidv4 } = require('uuid');
const _ = require('lodash');

function testLodash() {
  // Test data
  const users = [
    { id: 1, name: 'Alice', age: 25, active: true },
    { id: 2, name: 'Bob', age: 30, active: false },
    { id: 3, name: 'Charlie', age: 35, active: true },
    { id: 4, name: 'David', age: 40, active: false }
  ];

  // Example 1: Filter active users
  const activeUsers = _.filter(users, { active: true });
  console.log('Active Users:', activeUsers);

  // Example 2: Sort users by age in descending order
  const sortedByAge = _.orderBy(users, ['age'], ['desc']);
  console.log('Users sorted by age (desc):', sortedByAge);

  // Example 3: Get the names of all users
  const userNames = _.map(users, 'name');
  console.log('User Names:', userNames);
}

function testMoment() {
  console.log("Current time is:", moment().format());
}

function testUuidv4() {
  console.log("UUID is:", uuidv4());
}

function testAjv() {
  const ajv = new Ajv();
  const schema = {
    type: "object",
    properties: {
      foo: { type: "integer" },
      bar: { type: "string" },
    },
    required: ["foo"],
    additionalProperties: false,
  };
  const data = { foo: 1, bar: "abc" };
  const validate = ajv.compile(schema);
  const valid = validate(data);
  if (!valid) console.log(validate.errors);
}

function testBase64() {
  const text = 'Hello, world!';
  const textBytes = new TextEncoder().encode(text);
  const base64Encoded = base64.fromByteArray(textBytes);
  console.log('Base64 Encoded:', base64Encoded);

  const decodedBytes = base64.toByteArray(base64Encoded);
  const decodedText = new TextDecoder().decode(decodedBytes);
  console.log('Decoded Text:', decodedText);
}

function testValidator() {
  const result = validator.isEmail('fooo~bar.com');
  console.log("fooo~bar.com is email, right?", result);
}

function testFakerJS() {
  return {
    userId: faker.string.uuid(),
    username: faker.internet.username(),
    email: faker.internet.email(),
    avatar: faker.image.avatar(),
    password: faker.internet.password(),
    birthdate: faker.date.birthdate(),
    registeredAt: faker.date.past(),
  };
}

function testJwt() {
  const SECRET_KEY = 'your-secret-key';
  const payload = { userId: 123, username: 'testUser' };
  const token = jwt.sign(payload, SECRET_KEY, { expiresIn: '1h' });
  console.log('Generated Token:', token);
  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    console.log('Decoded Payload:', decoded);
  } catch (err) {
    console.error('Token verification failed:', err.message);
  }
}

mock.get("/testlibs", function (req, res) {
  console.log("==== this is a test of libs supported =====");
  testLodash();
  testMoment();
  testUuidv4();
  testAjv();
  testValidator();
  testBase64();
  testJwt();
  const jsonData = testFakerJS();
  return res.status(200).json(jsonData);
});

3. mock.define() 已棄用,使用 mock.[get|post|delete|...]() 反而

mock.define() 在這個新的模擬伺服器中已被棄用。請使用 mock.[get|post|delete|...]() 相反,這是 express.js 定義路線。請注意 mock.define() 仍然可用,但將來會停止支援。

您需要做什麼:

改變所有 mock.define()mock.[get|post|delete|...]()