Express 基础
1. Express 简介
Express 是一个基于 Node.js 平台的、极简且灵活的 Web 应用程序开发框架。它提供了一系列强大的功能,用于快速、轻松地创建健壮的 Web 应用和 API。
Express 的核心哲学是 “无主见” (Unopinionated) 和“最小化” (Minimal)。
- 无主见: Express 对项目的结构、使用的模板引擎或数据持久化方案等没有强制要求。这给予了开发者极大的灵活性,可以根据项目需求自由组合各种工具和库(例如,你可以选择 Pug, EJS 或 Handlebars 作为视图引擎,或搭配 Mongoose, Sequelize 等 ORM)。
- 最小化: Express 的核心功能集非常精简,主要只包含路由和中间件系统。其他任何高级功能(如 cookie 解析、文件上传)都可以作为第三方中间件按需引入,避免了框架的臃肿。
2. 搭建 Express 服务器
初始化 package.json
文件并安装 express
。
# 初始化项目
npm init -y
# 安装 express 依赖
npm install express
创建一个 app.js
文件(也可以是 index.js
或 server.js
),这是我们应用的入口点。
// 1. 引入 express 模块
const express = require("express");
// 2. 创建 express 应用实例
const app = express();
// 3. 定义一个简单的路由
// 当一个 GET 请求访问根路径 "/" 时,执行回调函数
app.get("/", (req, res) => {
// 使用 res.send() 向客户端发送响应
res.send("Hello, Express!");
});
// 4. 定义服务器监听的端口
const PORT = process.env.PORT || 3000;
// 5. 启动服务器
app.listen(PORT, (error) => {
// 错误处理:如果启动失败(如端口被占用),抛出错误
if (error) {
throw error;
}
// 启动成功,打印提示信息
console.log(`Server is listening on port ${PORT}!`);
});
在终端中运行以下命令来启动服务器:
node app.js
即可看到 Server is listening on port 3000!
的输出。
在开发过程中,每次修改代码后都需要手动重启服务器非常低效。Node.js 提供了内置的
--watch
模式来解决这个问题:node --watch app.js
。当app.js
或其依赖的任何文件发生变化时,服务器会自动重启。这是目前最简单、最推荐的开发时自动重启方式。
3. 请求与响应的生命周期
当一个 HTTP 请求(例如,在浏览器中访问 http://localhost:3000/
)到达服务器时,它会经历一个清晰的生命周期:
- 请求到达: 客户端(如浏览器)向服务器发送一个 HTTP 请求。
- Express 接收: Express 应用接收到请求,并将其封装成一个 请求对象 (Request Object),通常命名为
req
。同时,它还会创建一个 响应对象 (Response Object),命名为res
。 - 中间件链: 请求对象
req
和响应对象res
会被传递给一个由中间件 (Middleware) 函数组成的链条。请求会依次穿过这个链条。 - 路由匹配: Express 会根据请求的 HTTP 方法(GET, POST 等)和路径(
/
,/users
等)来匹配你定义的路由规则。 - 路由处理器执行: 一旦找到匹配的路由,对应的处理器函数(Handler)就会被执行。这个处理器函数本身也是一个中间件。
- 发送响应: 在处理器函数中,你必须调用响应对象
res
的某个方法(如res.send()
,res.json()
)来向客户端发送响应。一旦响应被发送,这个请求-响应周期就结束了。