Back

深入了解 AdonisJS 在 Node 开发中的应用

深入了解 AdonisJS 在 Node 开发中的应用

如果你已经用 Express 构建过几个 Node.js 后端,你一定熟悉这个流程:安装路由器,选择验证库,连接 ORM,配置身份认证,然后在每个新项目中重复这些步骤。这种方式可行,但你每次都在自己组装框架。

AdonisJS 采用了不同的方法。它是一个功能齐全的 TypeScript 后端框架,专为 Node.js 设计,在一个统一的包中提供了你需要的所有功能。

核心要点

  • AdonisJS 是一个功能齐全、TypeScript 优先的 Node.js 后端框架,遵循 MVC 模式,开箱即用地集成了路由、ORM、验证、身份认证等功能。
  • 与 Express 不同,Express 需要你为每个项目自行组装技术栈,而 AdonisJS 提供了一个统一的生态系统,所有组件无需配置即可协同工作。
  • AdonisJS v7 通过代码生成引入了端到端的类型安全,在编译时而非运行时捕获路由拼写错误、响应结构不匹配和错误的 Inertia props。
  • 该框架适合构建 REST API、全栈 Web 应用或 SaaS 平台的团队,他们希望在 Node.js 生态系统中获得类似 Laravel 或 Rails 风格的约定。

什么是 AdonisJS?

AdonisJS 是一个面向后端的 Node.js Web 框架,将 TypeScript 作为一等公民构建。它遵循 MVC 模式,开箱即用地提供路由、ORM、验证、身份认证、文件处理、邮件、速率限制和测试支持。

它自 2015 年以来一直在积极开发。当前版本 AdonisJS v7 代表了多年的实际应用改进,并在整个技术栈中引入了端到端的类型安全。

如果你使用过 Laravel 或 Rails,这些约定会让你感到熟悉。如果你来自 Express 或 Fastify,差异会立即显现:你不再需要组装工具,而是直接开始构建应用程序。

AdonisJS vs Express:核心差异

Express 在设计上是极简的。它提供路由和中间件,然后退居幕后。当你需要完全控制时这很有用,但这意味着每个项目都要从相同的设置工作开始:选择包、编写粘合代码,以及维护它们之间的兼容性。

AdonisJS 通过统一的生态系统解决了这个问题。以下是实际应用中的对比:

功能AdonisJSExpress
TypeScript 支持内置手动设置
ORMLucid(内置)自行选择
身份认证内置手动(如 Passport)
验证VineJS(内置)手动(如 Zod、Joi)
CLI 工具Ace CLI
文件上传内置 Drive手动

使用 Express,你需要在每个项目中做出这些决策。使用 AdonisJS,这些决策已经做好,各个组件无需配置即可协同工作。

AdonisJS TypeScript 后端的实际样子

控制器接收一个类型化的 HttpContext 对象。验证器使用 VineJS 定义,它运行异步验证并直接与 ORM 集成以进行数据库级检查。模型使用装饰器映射到你的迁移模式,因此你的列定义保持同步。

export default class PostsController {
  async store({ request, auth, response }: HttpContext) {
    const data = await request.validateUsing(createPostValidator)
    const post = await auth.user!.related('posts').create(data)
    return response.created(post)
  }
}

这是一个经过验证、身份认证和数据库支持的 POST 处理器。无需寻找中间件导入,无需手动类型转换。

注意: auth.user 上的非空断言(!)告诉 TypeScript 用户保证存在。在实践中,你会使用身份认证中间件保护此路由,确保在控制器运行之前用户已通过身份验证。

AdonisJS v7 的新增功能

AdonisJS v7 的核心特性是:由代码生成驱动的端到端类型安全。该框架在构建时扫描你的路由、转换器和 Inertia 页面组件,并自动生成 TypeScript 类型。

这意味着:

  • 路由名称经过类型检查。 urlFor('posts.shwo', ...) 中的拼写错误是编译错误,而不是运行时 404。
  • 响应结构是类型化契约。 转换器定义从服务器发出的数据。前端代码直接导入这些类型,无需手动复制接口。
  • Inertia props 在编译时验证。 如果你的控制器向页面组件发送错误的 props,TypeScript 会在浏览器之前捕获它。

v7 还提供了改进的启动套件,包含可用的登录和注册流程,由 SWC 驱动的更快 TypeScript 工具,通过 @adonisjs/otel 集成 OpenTelemetry,以及支持密钥轮换的重写加密模块。

AdonisJS v7 需要 Node.js 24 或更高版本,使框架与现代 Node 运行时功能保持一致。

谁应该使用它

AdonisJS 适合构建 REST API、全栈 Web 应用或 SaaS 平台的团队,他们希望在不增加企业级开销的情况下获得结构化开发体验。它不是要取代 Express 用于轻量级脚本或逻辑最小的微服务。但对于具有真实数据模型、身份认证和业务规则的应用程序,生产力差异是显著的。

该框架支持多种渲染方式——使用 Edge 的服务器渲染模板、通过 Inertia.js 的全栈 SPA,或纯 API 后端——同时在所有三种方式中保持后端代码的一致性。

结论

AdonisJS 提供了 Express 所没有的:一个完整、一致的后端工具包,从第一天起就能协同工作。借助 v7 的类型安全特性,你在服务器上编写的内容与前端使用的内容之间的差距几乎为零。

如果你正在启动一个新的 Node.js 项目,并希望减少配置时间、增加构建时间,AdonisJS 值得认真考虑。

常见问题

可以。AdonisJS 自 2015 年以来一直在积极开发,并被构建 SaaS 平台、REST API 和全栈 Web 应用的团队用于生产环境。版本 7 是最新的稳定版本,拥有活跃的社区和持续的开发。

当然可以。AdonisJS 支持 Inertia.js,它允许你使用 React、Vue 或 Svelte 构建全栈 SPA,同时将后端逻辑保留在 AdonisJS 控制器中。你也可以将其用作纯 API 后端,并连接任何你喜欢的前端。

AdonisJS 包含 Lucid,这是基于 Knex.js 构建的自有 ORM。Lucid 支持 Active Record 风格的模型、迁移、种子数据、工厂和关系。它开箱即用地支持 PostgreSQL、MySQL、SQLite 和 MSSQL。

架构转变是显著的,因为 AdonisJS 是约定驱动的,而 Express 是无主见的。但是,如果你已经使用 TypeScript 和像 Prisma 或 TypeORM 这样的 ORM,许多概念可以直接迁移。官方文档为每个核心功能提供了清晰的指南。

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay