三年前,我作为一名纯前端开发者,被迫临时接手一个 Node.js 后端项目,那个绝望的下午我几乎崩溃。六小时后,我却笑着对同事说:“原来后端这么简单?”。这不是魔法,而是因为遇见了 Express —— 一个让前端开发者也能轻松驾驭的后端框架。据 Stack Overflow 2022 年调查,87% 的 Node.js 开发者都在使用它,这不是没有原因的。
为什么你必须掌握 Express?
想象一下,如果 React 是前端的"超级英雄",那么 Express 就是后端的"钢铁侠" —— 没有花哨的外壳,但拥有强大的核心和无限的可扩展性。它就像一把瑞士军刀,看似简单,却能应对各种复杂场景。
作为 Node.js 生态中的基石级框架,Express 已经成为构建 Web 服务器和 API 的标准工具。GitHub 上超过 57,000 的 Star 数量和每周 1700 万次的下载量,足以证明它的统治地位。更令人惊讶的是,像 PayPal、Uber、IBM 这样的巨头也在核心业务中使用 Express。
但真正让我爱上 Express 的,是它的学习曲线 —— 对于熟悉 JavaScript 的前端开发者来说,你可能只需要一天,就能构建出一个可用的后端服务。不信?跟我一起看下去。
Express 快速起步:5 分钟创建你的第一个服务器
很多教程喜欢长篇大论讲概念,我们不一样 —— 先写代码,再解释。毕竟,没有什么比看到自己的代码成功运行更能激励人心的了。
首先,创建一个新文件夹,然后初始化项目:
mkdir my-express-app
cd my-express-app
npm init -y
npm install express
现在,创建一个名为 app.js
的文件,写入以下代码:
const express = require('express');
const app = express();
const PORT = 3000;
// 首页路由
app.get('/', (req, res) => {
res.send('Hello World! 我的第一个 Express 服务器跑起来了!');
});
// 添加一个API路由
app.get('/api/users', (req, res) => {
res.json([
{
id: 1, name: '张三' },
{
id: 2, name: '李四' },
{
id: 3, name: '王五' }
]);
});
// 启动服务器
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${
PORT}`);
});
现在,运行这个文件:
node app.js
打开浏览器,访问 http://localhost:3000
,你会看到"Hello World!"。访问 http://localhost:3000/api/users
,你会看到一个 JSON 格式的用户列表。
恭喜你!不到 20 行代码,你已经创建了一个能处理不同路由请求的 Web 服务器。是不是比你想象的简单得多?
提升开发效率:使用 nodemon 实现热重载
在开发过程中,每次修改代码都需要重启服务器是非常烦人的。安装 nodemon 可以解决这个问题:
npm install nodemon -D
修改 package.json:
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
现在运行 npm run dev
,每次保存文件,服务器都会自动重启。开发效率瞬间提升!
Express 核心思想:中间件机制的魔力
如果说 Express 有什么"秘密武器",那一定是它的中间件系统。简单来说,中间件就是处理请求的函数,它们像流水线一样依次处理请求,每个中间件都可以:
- 执行任何代码
- 修改请求和响应对象
- 结束请求-响应循环
- 调用下一个中间件
这看起来很抽象,但实际上非常直观。看看这个例子:
// 日志中间件
app.use((req, res, next) => {
console.log(`${
new Date().toISOString()} - ${
req.method} ${
req.path}`);
next(); // 调用下一个中间件
});
// 身份验证中间件
app.use((req, res, next) => {
const token = req.headers['authorization'];
if (token === 'secret-token') {
next(); // 验证通过,继续下一步
} else {
res.status(401).send('未授权');
// 注意这里没有调用 next(),请求处理到此结束
}
});
// 路由处理
app.get('/admin', (req, res) => {
res.send('欢迎来到管理页面');
});
当请求 /admin
路径时,请求会依次通过日志中间件和身份验证中间件,只有通过验证后才能看到管理页面。
这就是中间件的强大之处 —— 你可以像搭积木一样组合不同的功能,而不需要在每个路由中重复编写相同的代码。
想象一下,如果没有中间件,你需要在每个路由处理函数中都写一遍日志记录和身份验证的逻辑,代码会变得多么冗长和难以维护!
中间件的执行顺序很重要!
这里有个经典的面试题:下面代码的输出顺序是什么?
app.use((req, res, next) => {
console.log('A');
next();
console.log('B');
});
app.use((req, res, next) => {
console.log('C');
next();
console.log('D');
});
app.get('/', (req, res) => {
console.log('E');
res.send('Done');
console.log('F');
});
答案是:A, C, E, F, D, B。
这就是中间件的"洋葱模型" —— 请求像穿过洋葱层一样穿过中间件,然后响应再反向穿回来。理解这一点对于编写复杂的 Express 应用至关重要。
项目实战:构建一个迷你电商 API
光说不练假把式。接下来,我们要用 Express 构建一个小型电商 API,包含商品列表、购物车和用户认证功