背景
很多人第一次接触 Node.js 后端时,会把 Express 和 NestJS 放在一起比较:它们都能写接口,都能跑 HTTP 服务,也都常见于 JavaScript / TypeScript 后端项目里。
但这两个名字并不是完全同一层级的东西。Express 更像一个轻便的 Web 工具箱,帮你处理路由、中间件、请求和响应;NestJS 更像一套完整的后端工程框架,提前把模块、服务、依赖注入、测试和架构边界都安排好了。
理解这层差异之后,选型就不再是“谁更好”,而是“当前项目需要多大的工程约束”。
这次解决了什么
这次把 Express 和 NestJS 的关系压缩成一句话:
Express 是轻量级 Node.js Web 框架,适合自由、快速地写接口;NestJS 是企业级后端应用框架,默认底层可以基于 Express,也可以切换到 Fastify,并在上层提供模块化、依赖注入和装饰器式开发体验。
如果用项目规模来理解:
- 小服务、简单 API、快速原型:
Express通常更直接。 - 中大型业务系统、多人协作、长期维护项目:
NestJS更稳。 - 想先理解 Node 后端基本运行方式:先学
Express更容易。 - 想做接近 Java Spring / Angular 风格的工程化后端:
NestJS更合适。
关键过程
先看 Express。它的核心非常轻:创建应用、注册路由、挂中间件、返回响应。它不会强制你怎么分层,也不会规定项目目录。你可以把所有接口写在一个文件里,也可以自己拆成 routes、services、controllers、middlewares。
这种自由带来的好处是上手快、改动快、心智负担低。一个简单接口可能几行代码就能跑起来:
const express = require('express')
const app = express()
app.get('/users', (req, res) => {
res.json([{ name: 'Tom' }])
})
app.listen(3000)
但自由也有代价。项目变大之后,目录怎么拆、服务怎么注入、配置怎么管理、测试怎么组织、错误怎么统一处理,都需要团队自己定规则。规则定得好,Express 可以很稳;规则定得散,项目容易长成每个模块都不一样的样子。
再看 NestJS。它默认把后端项目拆成 Controller、Service、Module。控制器负责接 HTTP 请求,服务负责业务逻辑,模块负责组织依赖。它还内置依赖注入,鼓励用 TypeScript 和装饰器表达结构:
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll()
}
}
这种结构一开始看起来比 Express 重,但它解决的是长期维护问题。多人协作时,大家知道代码应该放在哪里;业务复杂时,依赖关系有统一管理方式;测试、拦截器、守卫、管道、异常过滤器这些能力也都有比较明确的位置。
所以 NestJS 并不是“更高级的 Express”,而是在 Express 这类底层 HTTP 能力之上,增加了一整套应用框架的组织方式。
踩坑
第一个坑,是把 Express 和 NestJS 当成平级替代品。严格说,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 更合适。
框架不是越重越专业,也不是越轻越灵活。真正靠谱的选择,是让框架的约束刚好匹配项目的复杂度。