likes
comments
collection
share

构建基于 Express 的 MVC 结构的 API 接口系统:完整指南与代码示例

作者站长头像
站长
· 阅读数 14

这篇文章和#Node.js 实战入门指南并不关联,可以单独观看,并不承接前后,是为了给后面的第七章之后的内容做一个铺垫,希望能让大家有一个全局大概的概念,为后面的内容要可以更好的理解

摘要:本文将介绍如何使用 Express 框架构建一个基于 MVC(Model-View-Controller)结构的 API 接口系统。从目录结构设计、路由设置、中间件使用到数据库连接和用户管理模块,我们将逐步展示每个环节的具体步骤,并提供相关的代码示例。通过本文的指南,您将能够系统地构建一个功能完备、易于扩展的 API 接口系统。

目录结构设计

在构建基于 Express 的 MVC 结构的 API 接口系统时,良好的目录结构设计是非常重要的。以下是一种常用的目录结构设计方案:

markdown
- app/
  - controllers/
    - admin/
      - UserController.js
      - ...
    - api/
      - UserController.js
      - ...
  - middlewares/
    - authenticationMiddleware.js
    - authorizationMiddleware.js
  - models/
    - User.js
    - ...
  - routes/
    - admin.js
    - api.js
    - auth.js
    - personal.js
  - views/
- config/
  - database.js
  - ...
- public/
- ...

其中,app/controllers 目录存放控制器文件,按照模块划分,例如 adminapi,每个模块下有相应的控制器文件,如 UserController.js

app/middlewares 目录存放中间件文件,包括鉴权中间件和权限验证中间件等。

app/models 目录存放模型文件,如 User.js,用于定义数据模型和数据库表之间的映射关系。

app/routes 目录存放路由文件,按照不同的路由路径划分,如 admin.jsapi.jsauth.jspersonal.js

config 目录存放配置文件,如数据库配置、环境变量配置等。

public 目录存放静态文件,如 CSS、JavaScript 文件等。

路由设置

路由是 API 接口系统中的核心部分,用于处理不同的请求路径。根据项目需求,我们需要设置四个路由入口:/admin/api/auth/personal。以下是示例代码:

// app/routes/admin.js
const express = require('express');
const router = express.Router();

// 管理员路由逻辑

module.exports = router;

// app/routes/api.js
const express = require('express');
const router = express.Router();

// API 路由逻辑

module.exports = router;

// app/routes/auth.js
const express = require('express');
const router = express.Router();

// 鉴权路由逻辑

module.exports = router;

// app/routes/personal.js
const express = require('express');
const router = express.Router();

// 个人路由逻辑

module.exports = router;

中间件使用

在构建 API 接口系统时,中间件的使用能够方便地处理请求和响应。根据前文的讨论,我们需要编写鉴权中间件和权限验证中间件。以下是示例代码:

// app/middlewares/authenticationMiddleware.js
const authenticationMiddleware = (req, res, next) => {
  // 鉴权中间件逻辑

  next();
};

module.exports = authenticationMiddleware;

// app/middlewares/authorizationMiddleware.js
const authorizationMiddleware = (req, res, next) => {
  // 权限验证中间件逻辑

  next();
};

module.exports = authorizationMiddleware;

这样,我们可以在路由中使用这些中间件来对请求进行鉴权和权限验证。

用户管理模块

返回状态管理 responseHelper.js

// app/helpers/responseHelper.js
const success = (res, data) => {
  return res.status(200).json({
    success: true,
    data,
  });
};

const serverError = (res, message) => {
  return res.status(500).json({
    success: false,
    error: message || 'Internal server error',
  });
};

const clientError = (res, message, statusCode = 400) => {
  return res.status(statusCode).json({
    success: false,
    error: message || 'Bad request',
  });
};

module.exports = {
  success,
  serverError,
  clientError,
};

上述代码定义了三个辅助函数:successserverErrorclientErrorsuccess 函数用于返回成功的响应结果,包含一个 data 参数,表示返回的数据。serverError 函数用于返回服务器错误的响应结果,包含一个可选的错误消息。clientError 函数用于返回客户端错误的响应结果,包含一个错误消息和可选的状态码,默认为 400(Bad Request)。

这些辅助函数可以在控制器中使用,用于统一处理 API 接口的响应,提供一致的格式和状态码。

用户管理是许多 API 接口系统中常见的功能之一。根据我们之前的讨论,我们设计了用户模型,并提供了相应的 CRUD(创建、读取、更新、删除)操作。以下是示例代码:

// app/models/User.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');

const User = sequelize.define(
  'User',
  {
    id: {
      type: DataTypes.BIGINT.UNSIGNED,
      primaryKey: true,
      allowNull: false,
      autoIncrement: true,
      comment: '用户 id',
    },
    username: {
      type: DataTypes.STRING(100),
      allowNull: false,
      comment: '用户名',
    },
    // 其他字段...
  },
  {
    tableName: 'hz_users',
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    schema: 'cms',
    schemaDelimiter: '_',
  }
);

module.exports = User;

// app/controllers/api/UserController.js
const User = require('../../models/User');
const { success, serverError, clientError } = require('../../helpers/responseHelper');

const UserController = {
  getAllUsers: async (req, res) => {
    try {
      const users = await User.findAll();
      return success(res, users);
    } catch (error) {
      return serverError(res, error.message);
    }
  },

  createUser: async (req, res) => {
    try {
      // 解析请求参数,并创建新用户
      // ...

      return success(res, 'User created successfully.');
    } catch (error) {
      return serverError(res, error.message);
    }
  },

  updateUser: async (req, res) => {
    try {
      // 解析请求参数,并更新用户信息
      // ...

      return success(res, 'User updated successfully.');
    } catch (error) {
      return serverError(res, error.message);
    }
  },

  deleteUser: async (req, res) => {
    try {
      // 解析请求参数,并删除指定用户
      // ...

      return success(res, 'User deleted successfully.');
    } catch (error) {
      return serverError(res, error.message);
    }
  },
};

module.exports = UserController;

以上是基于 Express 的 MVC 结构的 API 接口系统开发的完整指南与代码示例。通过按照合理的目录结构设计、设置路由、使用中间件以及编写模型和控制器,您可以轻松构建出功能完备、易于维护的 API