HTTP 概述
AdonisJS 主要是一个用于创建响应 HTTP 请求的应用程序的 Web 框架。在本指南中,我们将学习 AdonisJS 如何启动 HTTP 服务器、处理传入请求以及 HTTP 层可用的模块。
HTTP 层
AdonisJS 应用程序内部的 HTTP 层由以下模块组成。值得一提的是,AdonisJS HTTP 层是从头开始构建的,底层没有使用任何微框架。
路由模块负责定义应用程序的端点,这些端点称为路由。路由应该定义一个负责处理请求的处理程序。处理程序可以是闭包或对控制器的引用。
控制器是你绑定到路由以处理 HTTP 请求的 JavaScript 类。控制器充当组织层,帮助你将应用程序的业务逻辑划分到不同的文件/类中。
AdonisJS 为每个传入的 HTTP 请求创建一个 HttpContext 类的实例。HttpContext(又名
ctx)携带给定请求的信息,如请求体、headers、已认证用户等。AdonisJS 中的中间件管道是责任链设计模式的实现。你可以使用中间件拦截 HTTP 请求并在它们到达路由处理程序之前响应它们。
全局异常处理程序在一个中心位置处理 HTTP 请求期间引发的异常。你可以使用全局异常处理程序将异常转换为 HTTP 响应或将其报告给外部日志服务。
服务器
服务器模块连接路由器、中间件、全局异常处理程序,并导出一个
handle函数,你可以将其绑定到 Node.js HTTP 服务器来处理请求。
AdonisJS 如何启动 HTTP 服务器
HTTP 服务器在你调用 Server 类上的 boot 方法后启动。在底层,此方法执行以下操作。
- 创建中间件管道
- 编译路由
- 导入并实例化全局异常处理程序
在典型的 AdonisJS 应用程序中,boot 方法由 bin/server.ts 文件中的 Ignitor 模块调用。
此外,在调用 boot 方法之前定义路由、中间件和全局异常处理程序是必要的,AdonisJS 使用 start/routes.ts 和 start/kernel.ts 预加载文件来实现这一点。

HTTP 请求生命周期
现在我们有一个 HTTP 服务器监听传入请求。让我们看看 AdonisJS 如何处理给定的 HTTP 请求。
- 创建 HttpContext
作为第一步,服务器模块创建 HttpContext 类的实例,并将其作为引用传递给中间件、路由处理程序和全局异常处理程序。
如果你启用了异步本地存储,则相同的实例作为本地存储状态共享。
- 执行服务器中间件栈
接下来,执行服务器中间件栈中的中间件。这些中间件可以在请求到达路由处理程序之前拦截并响应请求。
此外,每个 HTTP 请求都会经过服务器中间件栈,即使你没有为给定端点定义任何路由。这允许服务器中间件在不依赖路由系统的情况下向应用程序添加功能。
- 查找匹配的路由
如果服务器中间件没有结束请求,我们会查找与
req.url属性匹配的路由。当不存在匹配的路由时,请求将以404 - Not found异常中止。否则,我们继续处理请求。- 执行路由中间件
- 执行路由处理程序
作为最后一步,请求到达路由处理程序并向客户端返回响应。
假设在过程中的任何步骤中引发了异常。在这种情况下,请求将交给全局异常处理程序,它负责将异常转换为响应。
- 序列化响应
一旦你使用
response.send方法定义响应体或从路由处理程序返回值,我们开始响应序列化过程并设置适当的 headers。了解更多关于响应体序列化