MockServer 迁移指南

APIGit

2024-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 库可供全局使用,无需显式导入即可直接使用。这些库包括:

  • 洛达什(_(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 编码/解码
  • cors(v2.8.5) - 跨源资源共享中间件
  • jsonwebtoken(v9.0.2)- JWT 创建和验证
  • 洛达什(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|...]()