这几天在折腾一个 Node.js 后端库,终于把核心功能收敛到了 1.0 版本。从最初只是封装数据库连接,到后来不断加入中间件机制、配置管理、路由注册和错误处理,整个过程中踩了不少版本兼容、环境配置方面的坑,也积累了一套相对完整的实战流程。网上关于 Node.js 后端开发的内容虽然很多,但往往零散不成体系,要么只讲安装,要么只贴一段代码,很少把一个后端库从环境准备到发布落地的完整链路讲清楚。这篇文章我就以“一个 Node.js 后端库发布 1.0”为背景,完整梳理一遍后端库/后端服务开发涉及的环境搭建、版本管理、项目设计、代码实现、运行验证与常见报错排查,新手可以照着一步步做,有基础的开发者也可以直接跳到实战部分复用配置和代码思路。
1. 背景与核心概念
1.1 Node.js 与后端开发的关系
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。它让开发者可以用 JavaScript 编写服务端代码,而不只是在浏览器里写前端逻辑。与传统的 Java、PHP 后端相比,Node.js 最大的特点是事件驱动、非阻塞 I/O,特别适合处理高并发、I/O 密集型的业务场景,比如 API 网关、实时推送、聊天服务、数据中台接口层等。
很多人对 Node.js 的认知停留在“前端工程化工具”上,比如 Webpack、Vite、Next.js 的底层都依赖 Node.js。但实际上,Node.js 在后端领域同样非常成熟。Express、Koa、Fastify、NestJS 都是基于 Node.js 的后端框架,它们负责处理 HTTP 请求、路由分发、中间件链、参数校验、错误处理等通用能力。而一个“Node.js 后端库”,通常是指在这些框架之上,或独立于框架,封装出来的一组可复用的后端基础设施,比如统一的响应体结构、配置加载器、数据库访问层、日志模块、鉴权中间件等。
1.2 一个后端库发布 1.0 意味着什么
在软件工程里,版本号从 0.x 到 1.0,通常代表项目进入稳定阶段。对于 Node.js 后端库来说,发布 1.0 一般意味着:
- 核心 API 已经稳定,不会频繁破坏性变更。
- 文档、类型定义、示例代码基本齐全。
- 经过了一定规模的真实业务验证,不再是实验性项目。
- 对外承诺了语义化版本规范,后续升级可以预测。
如果你正在学习或开发一个 Node.js 后端库,不要只关注“怎么把代码跑起来”,还要关注“这个库怎么被别人使用”“升级时怎么做到兼容”“遇到 Node.js 版本变化时怎么应对”。这些工程化能力,才是 1.0 版本真正考验的地方。
1.3 本文能帮你解决什么问题
结合近期的实操经验,本文会覆盖以下内容:
- Node.js 环境搭建与多版本管理,包含 nvm 的用法和常见坑。
- 一个后端服务/后端库的目录结构设计和核心模块拆分。
- 使用 Express 搭建最小可运行后端服务,并实现路由、中间件、配置加载、错误处理。
- 如何把项目封装成可发布的后端库,package.json 的关键字段。
- 常见问题排查清单,尤其是 Node.js 版本切换、node 命令找不到、依赖安装失败等高频报错。
- 工程化最佳实践,包括版本锁定、环境变量、日志、安全边界、测试与发布流程。
不管你是刚开始学 Node.js,还是已经在写后端接口但希望整理出一套规范化的项目结构,这篇文章都值得收藏。
2. 环境准备与版本管理
2.1 安装 Node.js 的常见方式
在开始任何 Node.js 后端开发之前,第一步是安装 Node.js。常见的安装方式有三种:
| 安装方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 官网安装包 | 日常学习、临时环境 | 下载即用,图形界面操作 | 不方便切换版本,卸载麻烦 |
| nvm(Node Version Manager) | 需要多版本共存 | 可以随时切换版本,推荐 | 需要额外的命令学习成本 |
| 包管理器安装 | Linux/macOS 环境 | 命令简单,和系统包管理统一 | 版本可能不是最新 |
对于后端开发者来说,我强烈推荐使用 nvm 管理 Node.js 版本。因为日常开发中,你可能同时维护多个项目,有的项目需要 Node.js 16,有的项目需要 Node.js 20,还有的工具链要求 Node.js 22 以上。如果只用官网安装包,一旦版本冲突,就只能卸载重装,非常痛苦。
2.2 使用 nvm 安装并切换 Node.js 版本
nvm 在 Windows 上有两个常见版本:原来的 nvm-windows 和较新的 nvm4w。这里以常见的 nvm-windows 为例。
安装 nvm 之后,先用管理员身份打开命令行工具(CMD 或 PowerShell),然后执行:
nvm version如果能看到版本号,说明 nvm 安装成功。接下来安装指定的 Node.js 版本:
nvm install 22.13.1安装完成后,使用这个版本:
nvm use 22.13.1然后验证当前 Node.js 和 npm 版本:
node -v npm -v在这里有一个非常重要的坑:如果你执行nvm install 24.19.0或者其他的版本号,提示node.js v24.19.0 is not yet released or is not available,说明这个版本号不存在,或者当前 nvm 的版本列表还没有更新到该版本。解决办法是先执行:
nvm list available查看哪些版本可以安装。不同 nvm 版本对版本列表的同步策略不太一样,有的需要更新 nvm 本身,有的过一段时间就会自动同步。
2.3 低版本切换到高版本,项目报错怎么办
在搜索热词里有“Node.js 低版本切换成高版本”的问题,实际开发中非常常见。比如你原来用 Node.js 18 开发的项目,切换到 Node.js 22 之后,运行npm install或启动项目时可能报错,常见原因有两类:
- 依赖包没有重新编译,原生模块(如
bcrypt、sharp)需要重新npm rebuild。 - 项目里的
engines字段限制了 Node.js 版本范围。
遇到这种情况,先不要急着换回低版本,按下面顺序排查:
# 1. 查看当前 Node 版本 node -v # 2. 删除旧的 node_modules 和 lock 文件 rm -rf node_modules package-lock.json # 3. 重新安装依赖 npm install # 4. 如果涉及原生模块,重建 npm rebuild如果是engines字段限制,看一下项目的package.json:
{ "engines": { "node": ">=18.0.0 <19.0.0" } }这意味着项目只允许 Node.js 18 版本运行。如果你非要用更高版本,需要修改这个范围,但要谨慎,因为高版本可能带来 API 变更。
2.4 环境变量与命令找不到的问题
很多新手安装完 Node.js 后,在命令行输入node -v提示“node 不是内部或外部命令”,或者在编辑器里启动项目时提示node.js not found。
这种情况的常见原因:
- Node.js 没有正确加入系统 PATH 环境变量。
- 编辑器安装后没有重启,环境变量没有刷新。
- 使用了 nvm 切换版本,但当前命令行窗口还是旧环境。
解决办法:
- 重新打开命令行窗口。
- 检查环境变量里是否包含 Node.js 安装目录(或 nvm 目录)。
- 如果在 IDE 里运行,重启 IDE。
如果你是在某个 GUI 工具里下载完 Node.js 相关依赖后提示node.js not found (please save below and restart),这种通常是该工具找不到当前系统的 Node.js 路径。优先检查 PATH,并把 Node.js 的安装目录加到系统环境变量里。
2.5 卸载 Node.js 失败的问题
有热词提到“Node.js 卸载不了报错 2053”。这类问题多见于 Windows 系统,原因通常是被占用的进程没有退出,或者卸载程序与杀毒软件冲突。可以尝试以下步骤:
- 关闭所有使用 Node.js 的进程,比如 IDE、终端、Node 服务。
- 在“控制面板 -> 程序和功能”中卸载。
- 如果还是失败,用管理员权限打开 CMD 执行
taskkill /f /im node.exe结束后台 Node 进程。 - 清理残留目录,比如
C:\Program Files\nodejs、C:\Users\你的用户名\AppData\Roaming\npm。 - 清理环境变量中的 Node.js 相关路径。
这里额外提醒一句:卸载和安装 Node.js 时,尽量先确认自己没有在跑重要的后台任务,尤其是生产相关的服务。
3. 后端库的核心设计思路
3.1 一个后端服务/后端库通常包含哪些模块
一个可以被长期维护的 Node.js 后端库,不能只是堆代码。它通常包含以下几类模块:
- 入口模块:负责启动服务、加载配置、初始化依赖。
- 路由模块:定义 HTTP 接口路径与处理函数的关系。
- 控制器层:处理业务逻辑,校验参数,组装响应。
- 中间件模块:处理请求日志、鉴权、跨域、错误捕获等横切逻辑。
- 配置模块:从环境变量或配置文件中读取参数。
- 工具模块:封装通用函数,比如日期格式化、加密、ID 生成。
- 测试模块:对核心功能编写自动化测试。
- 类型定义:如果使用 TypeScript,还需要
types目录。
在设计阶段,最忌讳把所有代码写在一个文件里。刚开始功能少,单文件还能维护,一旦接口多了,你就会发现改一个公共逻辑要动十几个接口,非常崩溃。所以在项目一开始就分层,后面会省很多事。
3.2 一个最小后端服务需要哪些依赖
以最常见的 Express 为例,一个最小可运行的后端服务,基础依赖通常包括:
| 依赖 | 作用 |
|---|---|
| express | HTTP 服务框架,处理路由和中间件 |
| dotenv | 加载.env环境变量文件 |
| morgan | HTTP 请求日志 |
| cors | 处理跨域请求 |
| nodemon(开发依赖) | 文件变化后自动重启服务 |
如果是封装后端库,还需要考虑typescript、jest、eslint、prettier等工程化工具。
这里不推荐追求“零依赖”,因为后端开发本身就需要成熟生态来减少重复造轮子。但也不建议盲目把所有依赖都装一遍,依赖越多,版本冲突的可能性越大。
3.3 项目目录结构设计
下面是一个适合后端服务和后端库通用的目录结构,本文后续实战会按照这个结构来写:
my-backend-library/ ├── src/ │ ├── config/ │ │ └── index.js │ ├── controllers/ │ │ └── userController.js │ ├── middlewares/ │ │ ├── errorHandler.js │ │ └── requestLogger.js │ ├── routes/ │ │ └── userRoutes.js │ ├── utils/ │ │ └── response.js │ ├── index.js │ └── app.js ├── tests/ │ └── user.test.js ├── .env.example ├── .gitignore ├── package.json └── README.md这个结构的好处是:路由、控制器、中间件、配置各自独立,后续替换数据库、增加鉴权、扩展新接口,都不会影响其他模块。
4. 从 0 到 1 开发一个后端服务
接下来我们进入实战。本文以一个简单的用户服务为例,实现两个接口:GET /api/users获取用户列表,POST /api/users新增用户。通过这个案例,你可以掌握路由、中间件、参数校验、错误处理和响应封装的基本写法。
4.1 创建项目结构
先新建项目目录,并初始化package.json:
mkdir my-backend-library cd my-backend-library npm init -y然后根据上面的目录结构,手动创建对应文件夹:
mkdir src mkdir src/config mkdir src/controllers mkdir src/middlewares mkdir src/routes mkdir src/utils mkdir tests4.2 安装依赖
npm install express dotenv morgan cors npm install --save-dev nodemon安装完成后,修改package.json里的scripts字段,增加开发启动命令:
{ "name": "my-backend-library", "version": "1.0.0", "description": "一个完整的 Node.js 后端服务示例", "main": "src/index.js", "scripts": { "start": "node src/index.js", "dev": "nodemon src/index.js" }, "dependencies": { "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", "morgan": "^1.10.0" }, "devDependencies": { "nodemon": "^3.1.4" } }4.3 配置文件
在src/config/index.js中编写配置加载逻辑:
// 文件路径:src/config/index.js const path = require('path'); // 优先加载 .env 文件 require('dotenv').config({ path: path.resolve(process.cwd(), '.env') }); const config = { env: process.env.NODE_ENV || 'development', port: parseInt(process.env.PORT, 10) || 3000, apiPrefix: process.env.API_PREFIX || '/api', }; module.exports = config;这里为什么要单独抽一个 config 模块?因为端口、环境变量这类配置在很多地方都会用到,如果每个文件都从process.env里读,一旦字段名写错,排查成本很高。统一封装之后,只需要维护一个文件。
接着创建.env.example:
NODE_ENV=development PORT=3000 API_PREFIX=/api复制一份为.env:
cp .env.example .env4.4 工具函数:统一响应结构
一个好的后端库,应该将所有接口的响应格式统一。这样前端对接时只需要处理一种结构,减少沟通成本。在src/utils/response.js中编写:
// 文件路径:src/utils/response.js function success(res, data = null, message = 'success', statusCode = 200) { return res.status(statusCode).json({ code: 0, message, data, }); } function fail(res, message = 'server error', statusCode = 500, code = 500) { return res.status(statusCode).json({ code, message, data: null, }); } module.exports = { success, fail, };这里的code字段是业务错误码,0表示成功,其他值表示不同类型的失败。你也可以根据团队规范定义成字符串,比如SUCCESS、PARAM_ERROR,这取决于后端库的使用场景。
4.5 控制器:用户模块
先创建一个简单的用户数据存储。为了演示,这里先用内存数组模拟数据库。在src/controllers/userController.js中编写:
// 文件路径:src/controllers/userController.js const { success, fail } = require('../utils/response'); // 模拟数据库内存数据 const users = [ { id: 1, name: 'Alice', age: 25 }, { id: 2, name: 'Bob', age: 30 }, ]; // 获取用户列表 function getUserList(req, res) { return success(res, users); } // 新增用户 function createUser(req, res) { const { name, age } = req.body || {}; // 基础参数校验 if (!name || typeof name !== 'string') { return fail(res, 'name is required and must be a string', 400, 400); } if (age === undefined || typeof age !== 'number' || age < 0) { return fail(res, 'age is required and must be a non-negative number', 400, 400); } const newUser = { id: users.length > 0 ? users[users.length - 1].id + 1 : 1, name, age, }; users.push(newUser); return success(res, newUser, 'user created', 201); } module.exports = { getUserList, createUser, };这里演示了参数校验的写法。实际项目中,参数校验往往更复杂,可以引入joi、zod或express-validator,但对于一个后端库的 1.0 版本,手写基础校验反而是更可控的方式。
4.6 路由模块
在src/routes/userRoutes.js中注册用户相关路由:
// 文件路径:src/routes/userRoutes.js const express = require('express'); const userController = require('../controllers/userController'); const router = express.Router(); // GET /api/users router.get('/users', userController.getUserList); // POST /api/users router.post('/users', userController.createUser); module.exports = router;这里把路由和控制器分开,路由只做映射,不写业务逻辑。这样后续如果要给某个接口加鉴权,可以直接在路由层加中间件,不影响控制器代码。
4.7 中间件:请求日志与错误处理
请求日志可以使用morgan,在src/app.js中引入。不过为了演示自定义中间件的写法,我们再写一个简单的请求耗时日志。在src/middlewares/requestLogger.js中:
// 文件路径:src/middlewares/requestLogger.js function requestLogger(req, res, next) { const start = Date.now(); res.on('finish', () => { const duration = Date.now() - start; console.log(`[${new Date().toISOString()}] ${req.method} ${req.originalUrl} ${res.statusCode} ${duration}ms`); }); next(); } module.exports = requestLogger;错误处理中间件需要在所有路由之后注册。在src/middlewares/errorHandler.js中:
// 文件路径:src/middlewares/errorHandler.js const { fail } = require('../utils/response'); // eslint-disable-next-line no-unused-vars function errorHandler(err, req, res, next) { console.error('[error]', err.message); if (err.type === 'entity.parse.failed') { return fail(res, 'invalid JSON body', 400, 400); } return fail(res, 'internal server error', 500, 500); } module.exports = errorHandler;这里特别注意:错误处理中间件必须保留四个参数(err, req, res, next),Express 才能识别它为错误处理中间件。少一个参数都不行。
4.8 组装应用
在src/app.js中创建 Express 应用:
// 文件路径:src/app.js const express = require('express'); const cors = require('cors'); const morgan = require('morgan'); const config = require('./config'); const requestLogger = require('./middlewares/requestLogger'); const errorHandler = require('./middlewares/errorHandler'); const userRoutes = require('./routes/userRoutes'); const app = express(); // 解析 JSON 请求体 app.use(express.json()); // 跨域处理 app.use(cors()); // HTTP 请求日志 app.use(morgan('dev')); // 自定义请求日志 app.use(requestLogger); // 健康检查接口 app.get('/health', (req, res) => { res.json({ code: 0, message: 'ok', data: { env: config.env, timestamp: Date.now(), }, }); }); // 业务路由,统一挂载在 /api 前缀下 app.use(config.apiPrefix, userRoutes); // 404 处理 app.use((req, res) => { return res.status(404).json({ code: 404, message: 'resource not found', data: null, }); }); // 错误处理中间件 app.use(errorHandler); module.exports = app;/health健康检查接口在部署到服务器或容器环境时很有用,负载均衡器可以通过它判断服务是否存活。
4.9 入口文件
在src/index.js中启动服务:
// 文件路径:src/index.js const app = require('./app'); const config = require('./config'); app.listen(config.port, () => { console.log(`Server is running at http://localhost:${config.port}`); console.log(`Environment: ${config.env}`); });4.10 运行与验证
执行启动命令:
npm run dev看到Server is running at http://localhost:3000表示启动成功。然后打开另一个终端,用curl验证接口:
curl http://localhost:3000/health预期输出:
{ "code": 0, "message": "ok", "data": { "env": "development", "timestamp": 1718000000000 } }获取用户列表:
curl http://localhost:3000/api/users预期输出:
{ "code": 0, "message": "success", "data": [ { "id": 1, "name": "Alice", "age": 25 }, { "id": 2, "name": "Bob", "age": 30 } ] }新增用户:
curl -X POST http://localhost:3000/api/users \ -H "Content-Type: application/json" \ -d '{"name":"Charlie","age":28}'预期输出:
{ "code": 0, "message": "user created", "data": { "id": 3, "name": "Charlie", "age": 28 } }如果传给新增接口一个非法的 JSON,比如{"name": 123},预期输出会走到错误处理中间件,返回参数校验失败的信息。
5. 常见问题与排查思路
在 Node.js 后端开发过程中,最容易出问题的往往不是业务代码,而是环境、版本、依赖这些基础环节。下面整理了一张排查清单,基本包含了我这段时间频繁遇到的问题。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
node -v提示不是内部或外部命令 | Node.js 未安装或未加入 PATH | 检查系统环境变量 PATH,添加 Node.js 安装目录或 nvm 目录;重新打开终端 |
IDE 提示node.js not found | IDE 启动时没有识别到 Node.js 环境变量 | 重启 IDE,或在 IDE 设置中手动配置 Node.js 路径 |
nvm install 24.19.0提示版本不可用 | 版本号不存在,或 nvm 版本列表未更新 | 执行nvm list available查看可用版本,更新 nvm 后重试 |
从低版本 Node.js 切到高版本后npm install报错 | 原生模块需要重新编译 | 删除node_modules和package-lock.json,重新安装;执行npm rebuild |
npm install下载慢或超时 | 网络原因 | 配置国内镜像源,例如npm config set registry https://registry.npmmirror.com |
| 启动报端口被占用 | 前一个服务没有关闭 | 找到进程并结束,Windows 使用 `netstat -ano |
| 新增接口后 404 | 路由没有挂载到 app 上 | 检查app.use(config.apiPrefix, userRoutes)是否注册,路由路径与请求路径是否一致 |
| 接口返回 500 | 代码抛异常,或错误处理中间件有问题 | 查看控制台错误日志,确认错误处理中间件是否最后注册 |
| JSON 请求体解析失败 | 请求头Content-Type不是application/json | 设置正确的请求头,或在客户端发送时明确指定 JSON 类型 |
| Windows 下卸载 Node.js 报 2053 | Node.js 进程未退出或系统残留 | 结束 node 进程,管理员权限运行卸载程序,清理残留目录与环境变量 |
| 打包到没有 Node.js 的电脑上无法运行 | Node.js 是运行时环境,目标机器未安装 | 要么在目标机器安装 Node.js,要么使用pkg或nexe将项目打包成可执行文件 |
6. 最佳实践与工程建议
6.1 用.nvmrc锁定项目 Node.js 版本
团队协作时,如果每个人都用自己的 Node.js 版本,很容易出现“我本地能跑,但你本地跑不起来”的问题。可以在项目根目录创建.nvmrc文件:
22.13.1然后在项目根目录执行nvm use,nvm 会自动读取这个文件并切换到对应版本。如果是 CI/CD 环境,也可以读取.nvmrc来安装项目所需的 Node.js 版本。
6.2 package.json 中声明 engines
在发布一个 Node.js 后端库时,应该在package.json中声明支持的 Node.js 版本范围:
{ "engines": { "node": ">=18.0.0 <25.0.0" } }这样使用者在安装时会得到提示,避免在完全不支持的版本上运行。
6.3 环境变量统一管理
不要在每个文件里直接读process.env。建议像本文的src/config/index.js一样,统一封装配置模块。同时提供.env.example作为模板提交到代码仓库,实际的.env加入.gitignore,避免敏感信息泄露。
6.4 统一响应结构
后端接口的响应结构一定要统一。前端对接时,只需要知道“如果code为 0 表示成功,否则读取message和data”。如果不统一,有的接口返回{ success: true, result: {} },有的返回{ code: 200, data: {} },前端就要针对每个接口写不同的处理逻辑,维护成本极高。
6.5 中间件顺序很重要
Express 中间件的执行顺序就是代码注册顺序。在本文示例中,express.json()要在路由之前注册,否则解析不了请求体;错误处理中间件要放在最后,否则捕获不到其他中间件抛出的异常。实际项目中,鉴权中间件、日志中间件、跨域中间件的位置也要仔细设计。
6.6 错误处理要兜底
后端服务不能把错误堆栈直接返回给前端,这样既暴露内部实现,也影响用户体验。正确做法是在错误处理中间件里记录完整错误日志,返回给客户端一个通用结构。同时,对常见的解析错误、参数错误做区分,返回不同的业务码。
6.7 安全边界
后端开发必须重视安全边界。本文示例中使用内存数组模拟数据库,真实项目中要换成数据库,并做好 SQL 注入防护。生产环境部署时,要使用 HTTPS;涉及用户登录的接口,要使用 JWT 或 Session,并通过 HTTPS 传输;涉及密码存储时,要使用bcrypt等加盐哈希算法,绝不能明文存储。
6.8 版本发布与语义化版本
当你的后端库准备发布 1.0 版本时,要遵守语义化版本规范:
- 修复 bug 且不影响兼容性时,发布 patch 版本(1.0.1)。
- 新增功能且不影响兼容性时,发布 minor 版本(1.1.0)。
- 出现破坏性变更时,发布 major 版本(2.0.0)。
发布 npm 包之前,先检查一下包内容:
npm pack --dry-run这个命令会列出发布时会包含哪些文件,避免把不必要的文件带到 npm 仓库里。
6.9 自动化测试
后端库的核心逻辑应该有自动化测试覆盖。以本文为例,至少要对getUserList和createUser两个接口写测试。使用 Node.js 内置的node:test模块可以避免引入太多测试依赖,也可以用 Jest、Vitest。下面是一个简单的 Jest 示例:
// 文件路径:tests/user.test.js const request = require('supertest'); const app = require('../src/app'); describe('User API', () => { test('GET /api/users', async () => { const res = await request(app).get('/api/users'); expect(res.statusCode).toBe(200); expect(res.body.code).toBe(0); expect(res.body.data.length).toBeGreaterThan(0); }); test('POST /api/users with invalid param', async () => { const res = await request(app).post('/api/users').send({ name: 123 }); expect(res.statusCode).toBe(400); expect(res.body.code).toBe(400); }); });如果使用 Jest,需要安装jest、supertest,并修改package.json:
{ "scripts": { "test": "jest" } }7. 总结与下一步学习建议
这篇文章从一个 Node.js 后端库发布 1.0 的背景出发,完整梳理了 Node.js 后端开发的环境搭建、版本管理、项目结构设计、核心代码实现、运行验证与常见问题排查。不管你是刚开始接触 Node.js,还是已经在写后端接口但希望整理出一套规范化流程,都可以把上面这套思路直接迁移到自己的项目里。
我建议你先不要急着去看更复杂的框架。动手做三件事:第一,用 nvm 装好 Node.js 环境,把版本切换熟练掌握;第二,把文中的用户服务完整敲一遍,理解路由、控制器、中间件和错误处理之间的关系;第三,尝试在这个最小服务上增加一个“删除用户”的接口,并补充一个简单的测试用例。只有亲手改过代码,遇到并解决过报错,这些知识点才会真正变成你自己的能力。
下一步,你可以根据实际需求选一个方向深入学习:如果想写更大型的应用,可以接触 NestJS;如果想追求极致的性能和灵活性,可以学习 Fastify;如果项目需要数据库,可以从 Prisma 或 Sequelize 开始;如果对工程化感兴趣,可以研究 TypeScript 重写整个项目、ESLint 规范、CI/CD 流水线和 Docker 部署。Node.js 后端生态非常大,但核心的 HTTP 处理模型、中间件洋葱模型、模块化设计思想都是共通的,打好基础之后,学任何框架都会轻松很多。