APIGIT MockServer - 由 Express.js 和 Node.js 提供支援的雲端沙箱

APIGit

2024-11-15

APIGIT MockServer powered by expressjs and node

建立模擬 API 通常是軟體開發的重要組成部分,無論是用於測試還是快速原型設計。介紹 模擬伺服器,一個強大的工具,環繞 Express.js 提供一個簡化的環境來定義模擬伺服器行為,而無需手動設定和配置 Express 應用程式。

MockServer 本質上是在 Node.js 沙箱環境中運行的 Express.js 應用程式的包裝器。它可以幫助您透過簡單的定義快速建立模擬API並處理各種HTTP請求。這篇部落格文章將向您介紹 MockServer,解釋其功能,並透過一些範例展示如何輕鬆上手。

MockServer的主要特點

  • Express.js 包裝器:MockServer 封裝了 Express.js,讓已經了解 Express.js 的開發人員熟悉且易於使用。
  • 預裝庫:流行的 JavaScript 函式庫,例如 lodash, moment, faker,以及更多預先安裝的內容,簡化了動態模擬響應的創建。
  • 支援路由和中介軟體:定義路由和中間件,就像在 Express 應用程式中一樣。
  • 有狀態數據:使用全域狀態變數輕鬆維護請求之間的數據,使其非常適合模擬現實世界的行為。
  • 模組化組織:Mock 伺服器腳本採用模組化組織方式,類似於日常開發實踐,易於管理和重複使用程式碼。

模擬伺服器如何運作

MockServer 的工作原理是允許您使用定義 API 路由 mock 目的。這 mock object 是一個全域實例,它包裝了 Express.js 應用程式並支援透過 mock.define() 功能。它提供了 Express.js 的靈活性,使創建和管理用於測試和開發的 API 變得簡單。

以下是 MockServer 如何簡化 API 建立的概述:

  • 使用 mock.define() 定義路由和請求處理程序。
  • 使用標準 Express.js 方法,例如 reqres 處理 HTTP 請求和回應。
  • 預先安裝的庫消除了手動安裝的需要,使您可以專注於定義模擬邏輯。

範例:定義路由和中介軟體

以下範例展示了使用 MockServer 建立路由是多麼容易:

const { routeCallBackFunc } = require('./util.js');

// Define routes using mock.define(path, method, handler)
mock.define("/user/:name", "POST", function(req, res) {
  // Handle the request
  res.status(404).send("User not found");
});

mock.define("/user/:name", "DELETE", function(req, res) {
  res.status(200).send("User deleted successfully");
});

// Use request handlers from separate files
mock.define("/user/:name", "POST", routeCallBackFunc);

這個例子示範如何使用 mock.define() 建立 POST 和 DELETE 路由。路由的定義與標準 Express.js 應用程式類似,確保熟悉的 API 結構。

將中介軟體與 MockServer 結合使用

就像在 Express.js 中一樣,您可以使用中間件在請求到達最終路由處理程序之前處理請求:

function mw1(req, res, next) {
  console.log("Middleware 1 executed");
  next();
}

function mw2(req, res, next) {
  console.log("Middleware 2 executed");
  next();
}

mock.use(mw1);
mock.use(mw2);

// Define middleware for a specific path
mock.use('/specific-path', (req, res, next) => {
  console.log('Middleware for /specific-path executed');
  next();
});

mock.use() 函數可用於為所有路由或特定路徑定義中間件,就像在 Express 應用程式中一樣。

處理請求和回應

MockServer 提供了一種使用標準 Express.js 約定與請求和回應互動的簡單方法。以下是常見任務的一些範例:

處理路由參數和查詢參數

mock.define('/repository/:user/:repo', 'GET', (req, res) => {
  const { user, repo } = req.params;
  res.json({
    message: 'Repository Details',
    user: user,
    repo: repo
  });
});

mock.define('/search', 'GET', (req, res) => {
  const { keyword, page, limit } = req.query;
  res.json({
    message: 'Search Parameters Received',
    keyword: keyword || 'none',
    page: page ? parseInt(page, 10) : 1,
    limit: limit ? parseInt(limit, 10) : 10
  });
});

設定響應狀態和標頭

mock.define('/not-found', 'GET', (req, res) => {
  res.status(404).json({
    message: 'Resource not found',
    code: 404
  });
});

mock.define('/single-header', 'GET', (req, res) => {
  res.set('Content-Type', 'application/json');
  res.set('X-Custom-Header', ['value1', 'value2']);
  res.json({ message: 'Headers set successfully!' });
});

使用預先安裝的庫

MockServer 預先安裝了流行的 JavaScript 庫,因此您可以直接在模擬定義中使用它們:

const _ = require('lodash');
const moment = require('moment');
const { faker } = require('@faker-js/faker');

mock.define('/test-libs', 'GET', (req, res) => {
  const randomUser = {
    id: faker.datatype.uuid(),
    name: faker.name.findName(),
    email: faker.internet.email()
  };
  res.json({
    currentDate: moment().format(),
    activeUsers: _.filter([{ active: true }, { active: false }], { active: true }),
    randomUser: randomUser
  });
});

這些程式庫可協助您輕鬆建立豐富的動態回應,無需額外安裝。如果您需要未列出的程式庫,請聯絡 APIGIT,我們將快速評估並新增它。支援的庫包括:

  • @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) - 驗證助手

使用 MockServer 進行狀態數據

MockServer 提供了一個 state 對象,它允許您在請求之間存儲和檢索數據,從而可以輕鬆模擬持久狀態:

// Create a stateful list of users
state.users = state.users || [];

mock.define('/users', 'POST', (req, res) => {
  if (!req.body.username) {
    return res.status(400).json({ status: "error", details: "Missing username" });
  }

  state.users.push(req.body);
  return res.status(200).json({ status: "ok" });
});

使用 MockServer 的模組化模擬腳本

為了保持更乾淨、更有組織的程式碼,MockServer 支援以模組化的方式將模擬腳本拆分為多個文件,類似於日常開發實踐。通常,您會有一個 main.js 定義所有路由的文件,然後需要來自單獨文件的處理程序定義。這允許您為路由處理程序建立可重複使用、結構良好的模組,從而保持程式碼庫的可維護性。

例如:

  • main.js:定義所有路由的主文件,並需要其他文件來定義處理程序。文件開頭需要處理程序模組,以提高可讀性和組織性。例如,新增或刪除使用者等處理程序可以在一個檔案中定義,並使用以下命令一起匯出 module.exports
// main.js

// Require handler modules at the top
const { userPostHandler, userDeleteHandler } = require('./handlers/userHandlers');

// Define routes
mock.define('/user/:name', 'POST', userPostHandler);
mock.define('/user/:name', 'DELETE', userDeleteHandler);
  • 處理程序/userHandlers.js:一個單獨的文件,匯出函數來處理不同的使用者相關請求,使用 module.exports 將它們一起導出。
// handlers/userHandlers.js

function userPostHandler(req, res) {
  res.status(404).send('User not found');
}

function userDeleteHandler(req, res) {
  res.status(200).send('User deleted successfully');
}

module.exports = {
  userPostHandler,
  userDeleteHandler
};

這種模組化方法可以幫助您邏輯地組織路線並實現跨不同模擬專案的可重複使用性。

結論

MockServer 透過在沙盒環境中利用 Express.js 的強大功能,簡化了設定模擬 API 的流程。憑藉內建函式庫、簡單的路由定義、中間件支援和狀態資料管理,對於希望快速且有效率地建立模擬 API 的開發人員來說,它是一個方便的解決方案。

無論您是初學者還是經驗豐富的開發人員,MockServer 都提供了模擬 API 行為所需的工具,而無需設定完整的 Express 伺服器的開銷。試試一下,讓您的 API 測試和原型設計更順利、更有效率。