这篇文章和#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
目录存放控制器文件,按照模块划分,例如 admin
和 api
,每个模块下有相应的控制器文件,如 UserController.js
。
app/middlewares
目录存放中间件文件,包括鉴权中间件和权限验证中间件等。
app/models
目录存放模型文件,如 User.js
,用于定义数据模型和数据库表之间的映射关系。
app/routes
目录存放路由文件,按照不同的路由路径划分,如 admin.js
、api.js
、auth.js
、personal.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,
};
上述代码定义了三个辅助函数:success
、serverError
和 clientError
。success
函数用于返回成功的响应结果,包含一个 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