如何构建Express.js REST API的结构——最佳实践 - Treblle博客

作者:API传播员 · 2025-12-17 · 阅读时间:6分钟

因此,您决定加入数千家其他公司,并使用 Express.js 来构建 REST API。那么,如何组织您的项目结构以实现最佳实践呢?本文将为您提供一些建议,帮助您构建一个健壮且高性能的 Express.js REST API 项目。


为什么需要良好的项目结构?

如果没有良好的项目结构,代码将变得难以理解,维护成本增加,甚至可能导致意外的功能损坏。这不仅会增加 Bug 的数量,还会让部署变得更慢、更具风险。

特别是当您计划扩展 API 时,早期的设计决策是否合理将直接影响扩展的难易程度。如果设计不当,可能需要耗费大量时间和资源重构应用程序。

通过采用系统化的安全检查和实时威胁评估工具(如 Treblle),可以从一开始就确保 API 结构的稳健性、可扩展性和安全性。这种方法能够降低错误发生的概率,加速部署流程,并减少扩展相关的风险。


项目组织的核心原则

在构建 Express.js REST API 时,以下两大核心原则至关重要:

  • 关注点分离:将功能和模块组织为单一、明确的任务,确保代码易于阅读和维护。
  • 模块化架构:将应用程序划分为独立且易于理解的部分,便于灵活组合,例如用于定时任务、单元测试等场景。

牢记这些原则,您可以更轻松地应对未来的需求变化。


独立的应用程序和服务器

在 Express API 项目中,通常需要配置基本应用程序并将其分配给 HTTP 服务器。虽然许多开发者会将这两部分代码写在一个文件中,但更好的做法是将应用程序和服务器分开。

为什么要分离?

  • 单元测试:分离后,可以在不初始化服务器的情况下对应用程序进行单元测试。
  • 职责清晰:应用程序和服务器的职责分离有助于代码的可维护性。

实现方式

  1. 创建一个 app 文件夹,用于存放应用程序代码,并在其中创建 index.js 文件配置应用程序。
  2. 在项目根目录下创建 server.js 文件,作为应用程序的入口点。该文件负责导入应用程序并分配 HTTP 服务器,同时可以添加与网络相关的配置(如虚拟主机、SSL 等)。

三层应用架构

为了构建一个清晰且可扩展的 API 项目,可以采用经典的“三层架构”:

  1. Web 层:负责处理 HTTP 请求,包括路由、控制器和中间件。
  2. 服务层:包含业务逻辑。
  3. 数据访问层:负责与数据库交互,通常使用 ORM(如 Mongoose 或 Sequelize)。

这种架构不仅实现了关注点分离,还具有足够的模块化,能够适应不同的需求。例如,您可以为定时任务或 CLI 命令创建接口,这些接口可以无缝替换 Web 层。


Web 层

Web 层是处理 HTTP 请求的核心部分,主要包括以下组件:

  • 路由:声明 API 端点路径并分配给控制器。
  • 中间件:可重用的插件,用于处理缓存控制、身份验证、错误处理等任务。
  • 控制器:负责解包 Web 层数据并将其分派到服务层。

文件结构示例

以下是一个包含 productuser 示例实体的文件结构:

应用程序/
index.js
路由/
product.js
user.js
控制器/
product.js
user.js
中间件/
cacheNoStore.js
服务器.js

路由的最佳实践

将路由逻辑抽象到单独的模块中是最佳实践。每个 API 实体(如产品、用户等)应有独立的路由文件。例如:

// routes/product.js
const express = require('express');
const router = express.Router();
const productController = require('../controllers/product');

router.get('/', productController.getAllProducts);
router.post('/', productController.createProduct);module.exports = router;

在应用程序的主文件中,可以统一声明这些路由,并设置路径前缀:

// app/index.js
const express = require('express');
const productRoutes = require('./routes/product');
const userRoutes = require('./routes/user');

const app = express();app.use('/api/products', productRoutes);
app.use('/api/users', userRoutes);module.exports = app;

控制器

控制器的职责是从 req 对象中提取相关数据,并将其传递给服务层。返回的结果应直接用于 HTTP 响应。

注意事项

  • 避免将 Web 层对象(如 reqres)传递到服务层。
  • 在分派到服务层之前,解包所有必要的数据(如 URL 参数、请求头、请求体等)。

数据访问层

数据访问层负责与数据库交互,通常使用 ORM 工具(如 Mongoose 或 Sequelize)。以下是文件结构示例:

应用程序/
index.js
路由/
product.js
user.js
控制器/
product.js
user.js
中间件/
cacheNoStore.js
模型/
product.js
user.js
服务/
product.js
user.js
服务器.js

组件化结构

在某些情况下,可以进一步优化项目结构,将每个实体的相关文件分组为组件。例如:

产品/
index.js
路由.js
控制器.js
服务.js
用户/
index.js
路由.js
控制器.js
服务.js
中间件/
cacheNoStore.js
模型/
product.js
user.js
服务器.js

这种组件化结构可以提高代码的可读性和可维护性,特别是在大型项目中。


总结

Express.js 是最流行的 Node.js 框架之一,其灵活性和轻量级特性使其深受开发者喜爱。然而,如果没有良好的项目结构,代码库很容易变得混乱,给维护和扩展带来困难。

通过实践关注点分离和模块化架构的原则,您可以构建一个健壮、灵活且高性能的 Express.js REST API 项目。无论是初学者还是经验丰富的开发者,这些最佳实践都能帮助您更高效地完成开发任务。

原文链接: https://blog.treblle.com/egergr/