实战日志 4 分钟

Express 和 NestJS 到底差在哪

用一套清晰的工程视角区分 Express 与 NestJS:一个是轻量 Web 框架,一个是面向长期维护的后端应用框架。

背景

很多人第一次接触 Node.js 后端时,会把 ExpressNestJS 放在一起比较:它们都能写接口,都能跑 HTTP 服务,也都常见于 JavaScript / TypeScript 后端项目里。

但这两个名字并不是完全同一层级的东西。Express 更像一个轻便的 Web 工具箱,帮你处理路由、中间件、请求和响应;NestJS 更像一套完整的后端工程框架,提前把模块、服务、依赖注入、测试和架构边界都安排好了。

理解这层差异之后,选型就不再是“谁更好”,而是“当前项目需要多大的工程约束”。

这次解决了什么

这次把 ExpressNestJS 的关系压缩成一句话:

Express 是轻量级 Node.js Web 框架,适合自由、快速地写接口;NestJS 是企业级后端应用框架,默认底层可以基于 Express,也可以切换到 Fastify,并在上层提供模块化、依赖注入和装饰器式开发体验。

如果用项目规模来理解:

  • 小服务、简单 API、快速原型:Express 通常更直接。
  • 中大型业务系统、多人协作、长期维护项目:NestJS 更稳。
  • 想先理解 Node 后端基本运行方式:先学 Express 更容易。
  • 想做接近 Java Spring / Angular 风格的工程化后端:NestJS 更合适。

关键过程

先看 Express。它的核心非常轻:创建应用、注册路由、挂中间件、返回响应。它不会强制你怎么分层,也不会规定项目目录。你可以把所有接口写在一个文件里,也可以自己拆成 routesservicescontrollersmiddlewares

这种自由带来的好处是上手快、改动快、心智负担低。一个简单接口可能几行代码就能跑起来:

const express = require('express')
const app = express()

app.get('/users', (req, res) => {
  res.json([{ name: 'Tom' }])
})

app.listen(3000)

但自由也有代价。项目变大之后,目录怎么拆、服务怎么注入、配置怎么管理、测试怎么组织、错误怎么统一处理,都需要团队自己定规则。规则定得好,Express 可以很稳;规则定得散,项目容易长成每个模块都不一样的样子。

再看 NestJS。它默认把后端项目拆成 ControllerServiceModule。控制器负责接 HTTP 请求,服务负责业务逻辑,模块负责组织依赖。它还内置依赖注入,鼓励用 TypeScript 和装饰器表达结构:

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll()
  }
}

这种结构一开始看起来比 Express 重,但它解决的是长期维护问题。多人协作时,大家知道代码应该放在哪里;业务复杂时,依赖关系有统一管理方式;测试、拦截器、守卫、管道、异常过滤器这些能力也都有比较明确的位置。

所以 NestJS 并不是“更高级的 Express”,而是在 Express 这类底层 HTTP 能力之上,增加了一整套应用框架的组织方式。

踩坑

第一个坑,是把 ExpressNestJS 当成平级替代品。严格说,Express 更偏底层 Web 框架,NestJS 更偏应用框架。NestJS 默认可以跑在 Express 上,所以它们不是简单的互斥关系。

第二个坑,是只按学习成本选型。Express 学起来更快,但如果项目会长期演进,后期团队仍然要补上架构规范。NestJS 学习成本高一些,但很多规范是一开始就内置的。

第三个坑,是以为 NestJS 一定适合所有项目。对于很小的脚本服务、临时接口、个人工具,NestJS 的模块和装饰器可能显得过重。这时 Express 的轻量反而是优势。

第四个坑,是忽略 TypeScript。Express 可以写 TypeScript,但不是围绕 TypeScript 设计的;NestJS 从心智模型到生态文档都更贴近 TypeScript。如果团队本来就在用 TypeScript,NestJS 的工程一致性会更明显。

最后方案

可以用下面这套规则做初步判断:

  • 想快速写几个接口,结构自己控制,选 Express
  • 想做用户、权限、订单、任务队列、数据库、日志、测试这些长期维护能力,优先看 NestJS
  • 项目小、变化快、没有复杂团队协作,Express 更轻。
  • 项目大、模块多、多人维护,NestJS 更省后期治理成本。
  • 学习路线可以先从 Express 入门,再学 NestJS 的工程化分层。

如果必须给一句实用结论:Express 适合“先跑起来”,NestJS 适合“长期跑下去”。

以后怎么做

以后遇到 Node.js 后端选型,可以先问四个问题:

  • 这个项目是临时工具,还是长期系统?
  • 团队是否需要统一的目录结构和分层规范?
  • 是否已经全面使用 TypeScript?
  • 后续会不会接入权限、数据库、队列、定时任务、日志、测试等一整套后端能力?

如果答案偏轻、偏快、偏自由,Express 很合适。
如果答案偏团队、偏复杂、偏长期维护,NestJS 更合适。

框架不是越重越专业,也不是越轻越灵活。真正靠谱的选择,是让框架的约束刚好匹配项目的复杂度。