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 库,例如lodashmomentfaker等都是预先安装的,简化了动态模拟响应的创建。
  • 支持路由和中间件:像在 Express 应用程序中一样定义路由和中间件。
  • 状态数据:使用全局状态变量轻松维护请求之间的数据,使其完美地模拟真实世界的行为。
  • 模块化组织:Mock服务器脚本采用模块化组织,类似于日常开发实践,易于管理和重用代码。

MockServer 的工作原理

MockServer 的工作原理是允许你使用以下方式定义 API 路由**mock** 目的。 嘲笑是一个全球性的Express.js 应用程序由底层 apigit mock 服务器框架自动创建。您可以按照 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 编码/解码
  • cors(v2.8.5) - 跨源资源共享中间件
  • jsonwebtoken(v9.0.2)- JWT 创建和验证
  • 洛达什(v4.17.21)- 通用实用程序
  • 片刻(v2.30.1) - 时间和日期处理
  • 唯一标识(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文件定义了所有路由,然后需要来自单独文件的处理程序定义。这样您就可以为路由处理程序创建可重复使用、结构良好的模块,从而使您的代码库易于维护。

例如:

  • 主.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 测试和原型设计更顺畅、更高效。