MockServer遷移指南

APIGit

2024-11-14

APIGIT MockServer Migration Guide

介紹

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

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

主要變更和遷移詳細信息

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

1.模擬伺服器的URL更改

舊的網址格式: your-mockserver.mock.apigit.com

新的網址格式: 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 庫是全域可用的,允許直接使用而無需明確導入。其中包括:

  • 洛達什(_ (v4.17.21) - 通用實用函數
  • 時刻 (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 編碼/解碼
  • 科爾斯 (v2.8.5) - 跨源資源共享中間件
  • jsonwebtoken (v9.0.2) - JWT 建立和驗證
  • 洛達什 (v4.17.21) - 通用實用程序
  • 片刻 (v2.30.1) - 時間和日期處理
  • uuid (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|...]()