Node、Express、MongoDB这组技术组合,几乎可以算是 Node.js 后端开发最经典的“入门三件套”。不管你是刚转行做后端,还是前端想扩展服务端能力,这套栈都能让你在很短时间内写出一套可用的 REST API,并且很容易延伸到真实项目。很多朋友卡住的地方并不是业务逻辑,而是环境安装、版本选择、数据库连不上这类基础问题。这篇内容我会从环境准备、Express 框架细节、MongoDB 操作到部署排查,把我在实际开发中踩过的坑和验证过的方法完整整理一遍。
1. 先把环境弄清楚:Node 版本决定你后面少踩一半的坑
很多后端新手第一步就挂在环境上。官方下载页给的是最新版 Node,但实际工作中你会发现,不同项目对 Node 版本的要求差异很大,有的老项目还在用 14,有的新项目已经要求 18 以上。如果直接装一个最新版然后开始开发,大概率会遇到依赖包不兼容、运行报错这类问题。所以我的第一个建议是:不要用官网安装包直接装最新版,优先用 nvm 管理多个 Node 版本。
1.1 为什么推荐 nvm 而不是直接装单个 Node
nvm 的全称是 Node Version Manager,也就是 Node 版本管理器。它的作用类似 Python 的 pyenv。通过 nvm,你可以在同一台机器上安装多个 Node 版本,随时切换,并且每个项目可以用独立的版本。比如公司老项目需要 Node 14,你手里新项目需要 Node 18,用 nvm 就可以互不干扰地并存。
在 Windows 上我推荐使用 nvm-windows,这是由 coreybutler 维护的独立版本,跟 Linux 上的 nvm 不是同一个项目,但使用思路一致。安装完成后,几个最常用的命令是:
bash复制# 查看本地已安装版本
nvm list
# 查看远程所有可用版本
nvm list available
# 安装指定版本
nvm install 18.20.4
# 切换全局使用版本
nvm use 18.20.4
安装完之后我建议顺手把全局配置目录确认一下。nvm-windows 默认会要求在安装目录下配置 settings.txt,其中 root 和 path 指向 nvm 目录和 nodejs 软链接目录。切版本的时候,nvm 会更新 nodejs 目录下的软链接,这样你在命令行里执行 node -v 看到的版本就是当前选中的版本。
1.2 Windows 和 Linux 下安装 Node 时的高频报错
Windows 用户比较容易遇到一个问题:下载了 node.msi 安装之后,命令行里执行 node 提示“不是内部或外部命令”。这个问题绝大多数时候是环境变量没生效。正确做法是安装完之后手动检查系统环境变量里是否包含 Node 的安装目录(比如 C:\Program Files\nodejs),然后重新打开一个终端窗口,让新的 PATH 生效。
Linux 用户如果使用系统包管理器安装,比如 apt install nodejs,装完经常会发现 node 版本很老,甚至 npm 都没有一起装上。所以推荐在 Linux 上使用 NodeSource 或直接通过 nvm 安装,nvm 的安装脚本一行就能完成:
bash复制curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
安装完成后重新打开终端,用 nvm install --lts 安装最新的 LTS 版本即可。
另外专门提醒一点:安装 Node 时尽量不要使用 sudo 或者管理员权限。Node 本身不需要写入系统保护目录,用 nvm 安装在用户目录下反而是最干净的。我之前遇到过用 root 部署 Node 项目,后面所有的日志文件、上传目录全部变成 root 属主,普通用户完全没法管理,处理起来非常麻烦。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Express:路由、中间件、错误处理一次说清
Express 是 Node.js 生态里最经典的 Web 框架。它的核心思想非常简单:接收请求、处理请求、返回响应。但由于它的自由度很高,很多刚接触的人会困惑于“代码应该写在哪里”“中间件到底是什么作用”。我平时给团队里新人讲的时候,喜欢把 Express 应用比作一条流水线:请求从入口进来,依次经过一系列处理环节,最后交付响应。这些处理环节就是中间件,而路由是指定哪类请求由哪个流水线处理。
2.1 CommonJS 和 ES Module,不然后面全是报错
热词里有一个很典型的错误:SyntaxError: the requested module 'node:util' does not provide an export named 'xxx'。这个报错的根源就是模块系统混用了。
Node.js 默认使用的是 CommonJS 规范,也就是 package.json 里没有 "type": "module" 时,你用 require() 加载模块。而如果你在 package.json 里设置了 "type": "module",Node 会把 .js 文件当作 ES Module 来处理,此时你只能使用 import 语法,并且无法直接 require 一个 ESM 风格的模块。
网上很多教程写的是 ES Module 版本,代码长这样:
javascript复制import express from 'express';
import { MongoClient } from 'mongodb';
但如果你把这份代码放进一个 CommonJS 项目,没做任何配置,就会遇到模块解析错误。解决办法有两个方向:
第一个方向是统一为 ESM。在 package.json
