菜单

Express 应用/服务器分离

相关源文件

本文档详细介绍了将 Express 应用定义(路由、中间件等)与网络相关代码(服务器创建、端口配置、协议处理)分离的推荐做法。这种架构模式在可测试性、代码组织和应用程序灵活性方面带来了显著的好处。

有关更广泛的项目结构策略的信息,请参阅 基于组件的架构

概述

Express 应用/服务器分离是一种基本架构模式,我们在其中保持清晰的界限

  1. Express 应用 (app.js) - 包含 API 定义、中间件设置和路由处理程序
  2. 网络服务器 (www) - 处理服务器创建、端口配置和协议设置

这种分离遵循单一职责原则,将网络关注点与应用程序逻辑分开。

来源: sections/projectstructre/separateexpress.basque.md5-7

实现架构

实现遵循一个简单但强大的结构

  1. app.js/app.ts 文件定义 Express 应用程序、路由和中间件
  2. bin/www 文件导入应用并用它创建一个 HTTP 服务器

这样就在应用程序的功能及其网络暴露方式之间实现了清晰的分离。

来源: sections/projectstructre/separateexpress.basque.md11-20 sections/projectstructre/separateexpress.basque.md20-54

代码结构

Express 应用 (app.js)

Express 应用文件包含应用程序行为的定义,包括

  • Express 实例化
  • 中间件配置(请求体解析器、CORS 等)
  • 路由定义
  • 错误处理中间件

来源: sections/projectstructre/separateexpress.basque.md11-18

服务器实现 (bin/www)

服务器文件处理网络相关事宜

  • 导入 Express 应用
  • 设置 HTTP 服务器
  • 配置端口设置
  • 处理服务器生命周期事件(启动、关闭)

来源: sections/projectstructre/separateexpress.basque.md20-35

主要益处

优点描述
可测试性使用 supertest 等工具测试 API 路由,无需网络开销
职责分离应用程序逻辑与网络配置之间的清晰界限
部署灵活性同一 API 可以在不同的网络条件下部署
维护当网络和应用程序关注点独立演变时,更易于维护
模块化使 Express 应用程序更具模块化和可重用性

来源: sections/projectstructre/separateexpress.basque.md5-7

测试优势

此分离最显著的好处之一是能够在不启动网络服务器的情况下测试 API 路由。

使用 supertest 等测试库,您可以

  1. 直接导入您的 Express 应用
  2. 向您的路由发送模拟 HTTP 请求
  3. 在没有网络开销的情况下断言响应
  4. 实现更快的测试执行
  5. 获得更准确的代码覆盖率指标

使用 supertest 进行测试的示例

来源: sections/projectstructre/separateexpress.basque.md56-102

实现考量

在实现此模式时,请牢记以下注意事项

  1. 导出应用:始终在 app.js 文件的末尾导出您的 Express 应用实例
  2. 环境变量:在服务器文件中处理端口配置和其他环境变量
  3. 错误处理:在 app.js 中设置错误处理,但网络相关的错误处理在 www 文件中处理
  4. 文件名:常见的命名约定是 app.js/server.js 或 app.js/www
文件职责
app.js路由、中间件、Express 配置、应用程序逻辑
bin/www服务器创建、端口设置、SSL/TLS 配置、服务器生命周期

来源: sections/projectstructre/separateexpress.basque.md11-54

与组件化架构的集成

此模式通过提供一种导出 Express 应用的干净方式,与基于组件的架构方法(2.1)相辅相成。在基于组件的结构中,每个组件可能有自己的路由,这些路由会在主 app.js 文件中组合。

来源: sections/projectstructre/breakintcomponents.basque.md1-8

结论

Express 应用/服务器分离模式是一种简单而强大的架构选择,它为您的 Node.js 应用程序带来了显著的好处。通过清晰地将应用程序逻辑与网络关注点分离,您可以创建更易于测试、维护和灵活的应用程序。

此模式推荐用于所有 Express 应用程序,无论其规模大小,因为它奠定了良好的架构基础,能够支持您的应用程序的成长。