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

APIGit

2024-11-15

APIGIT MockServer powered by expressjs and node

創建模擬 API 是軟體開發的一個重要方面,無論是出於測試目的還是快速原型設計。 APIGIT MockServer 透過包裝 Express.js 提供簡化的解決方案,提供簡化的環境來定義模擬伺服器行為,而無需手動設定和設定 Express 應用程式。

APIGIT 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 目的。 嘲笑 是一個全球性的 Express.js 應用程式 由底層 apigit 模擬伺服器框架自動建立。您可以依照 Express.js 文件中提供的指南,使用 mock.[method] 定義路由。

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

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

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

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

mock.get("/user/:name", function (req, res) {
 return res.status(200).send("hello" + req.params.name);
});

mock.post('/test-urlencoded', (req, res) => {
 console.log('Received x-www-form-urlencoded data:', req.body);
 res.status(200).send({ message: 'Received x-www-form-urlencoded data', data: req.body });
});

mock.get('/testauth', exampelAuthMiddleware, (req, res) => {
 res.status(200).send('This route is to deomostrate auth through middleware ');
});

mock.get('/testmd2', firstMiddleware,  secondMiddleware, (req, res) => {
 res.status(200).send('This route has multiple middlewares!');
});

// !!!== mock.define is deprecated and provided for compatibility only. Please use mock.[method] instead, as it follows the native Express.js approach. !!!
mock.delete("/user/:name", function(req, res) {
  // handle req
  res.status(200).send("success");
});

請注意 mock.define() 已被棄用,僅出於相容性目的而提供。我們建議使用 mock.[method] 相反,因為它與原生一致 Express.js 方法。

將中介軟體與 MockServer 結合使用

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

const exampelAuthMiddleware = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  if (!authHeader) {
    return res.status(401).send('Authorization header missing');
  }

  const token = authHeader.split(' ')[1];
  if (!token) {
    return res.status(401).send('Token missing');
  }

  try {
    const SECRET_KEY = 'your-secret-key';
    const decoded = jwt.verify(token, SECRET_KEY);
    req.user = decoded;
    next();
  } catch (err) {
    return res.status(403).send('Invalid token');
  }
};

function firstMiddleware(req, res, next) {
  console.log('First middleware');
  next();
}

function secondMiddleware(req, res, next) {
  console.log('Second middleware');
  next();
}

mock.use((req, res, next) => {
  console.log("middware for all routes");
  next();
});

mock.get('/testauth', exampelAuthMiddleware, (req, res) => {
  res.status(200).send('This route is to deomostrate auth through middleware ');
});

mock.get('/testmd2', firstMiddleware,  secondMiddleware, (req, res) => {
  res.status(200).send('This route has multiple middlewares!');
});
   

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

處理請求和回應

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

處理路由參數和查詢參數

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

mock.get('/search', (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.get('/not-found', (req, res) => {
  res.status(404).json({
    message: 'Resource not found',
    code: 404
  });
});

mock.get('/single-header', (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.get('/test-libs', (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.post('/users', (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.post('/user/:name', userPostHandler);
mock.delete('/user/:name', 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 測試和原型設計更順利、更有效率。