Express 入门全指南:从 0 搭建你的第一个 Node Web 服务器
本文将带你从零开始,快速搭建一个基于 Express 的 Web 服务器,理解路由与中间件的执行机制,并给出详细注释与实践示例。
一、Express 是什么?
Express
是 Node.js 中最流行的 Web 服务器框架。
通过它可以非常方便地:
- 搭建网站服务器;
- 处理 HTTP 请求;
- 管理路由与中间件;
- 支持静态资源、Cookie、Session 等常见功能。
它的定位就像是:
「Node.js 的服务器开发框架」,帮助你快速构建一个可以响应网页请求的后端。
二、使用步骤
1️ 初始化项目
csharp
yarn init -y
或使用 npm:
csharp
npm init -y
2️ 安装 express
csharp
yarn add express
3️ 创建服务器文件
创建一个 index.js
文件,写入以下代码👇
javascript
// 1. 引入 express
const express = require("express")
// 2. 获取服务器实例(app 就代表整个 Web 应用)
const app = express()
/*
Express 默认不会处理任何请求,
想要服务器能正确响应,就必须为它设置路由或中间件。
*/
三、路由(Route)
路由的作用:
根据"请求路径 + 请求方式"来决定由谁处理该请求。
javascript
// GET 请求:访问页面或获取数据
app.get("/hello", (req, res) => {
console.log("有人访问 /hello 了!")
// 读取请求信息(req)
console.log(req.url)
// 响应客户端(res)
res.send("<h1>这是我的第一个 Express 服务器</h1>")
})
常见请求方法:
GET
:获取数据POST
:提交数据PUT
:更新数据DELETE
:删除数据
访问地址示例:
bash
http://localhost:3000/hello
四、中间件(Middleware)
1. 什么是中间件?
中间件是 Express 的核心机制,用于在请求到达路由前后执行逻辑。
例如:打印日志、解析请求体、校验权限等。
定义格式:
javascript
app.use((req, res, next) => {
console.log("我是中间件!")
next() // 调用 next() 表示进入下一个中间件或路由
})
⚠️ 注意:
next()
必须在响应结束前调用。- 如果调用了
res.send()
后仍执行next()
,会报错(因为响应已结束)。
2. 多个中间件顺序执行示例
javascript
app.use((req, res, next) => {
console.log("111", Date.now())
next()
})
app.use((req, res, next) => {
console.log("222", Date.now())
next()
})
app.use((req, res) => {
console.log("333", Date.now())
res.send("<h1>333 - 响应结束</h1>")
})
执行结果:
111 1739933280000
222 1739933280005
333 1739933280006
请求会从第一个中间件依次向下传递,直到一个中间件终止(比如调用 res.send()
)。
3. 路由与中间件的区别
特性 | 路由(app.get() ) |
中间件(app.use() ) |
---|---|---|
区分请求方式 | ✅ 是(GET、POST) | ❌ 否 |
匹配路径 | 精确匹配 | 可匹配父级路径 |
是否自动放行 | 否 | 需手动调用 next() |
常见用途 | 业务处理 | 日志、权限、静态资源等 |
五、启动服务器
javascript
// 启动服务器
app.listen(3000, () => {
console.log("✅ 服务器已启动:http://localhost:3000")
})
访问你的服务器:
arduino
http://localhost:3000
六、完整示例
下面是一份整合了中间件与路由的完整 Express 示例:
javascript
// 引入 express
const express = require("express")
// 创建应用实例
const app = express()
// 1️⃣ 中间件(全局)
app.use((req, res, next) => {
console.log("【全局中间件】请求时间:", new Date().toLocaleString())
next()
})
// 2️⃣ 路由定义
app.get("/", (req, res) => {
res.send("<h1>首页 - 欢迎访问我的服务器</h1>")
})
app.get("/about", (req, res) => {
res.send("<h1>关于我们</h1>")
})
// 3️⃣ 兜底中间件(404)
app.use((req, res) => {
res.status(404).send("<h1>404 - 页面未找到</h1>")
})
// 4️⃣ 启动服务器
app.listen(3000, () => {
console.log("🚀 服务器启动成功:http://localhost:3000")
})
七、常见问题与易错点
问题 | 原因 | 解决方案 |
---|---|---|
Cannot set headers after they are sent |
在响应结束后再次发送响应 | 确保 res.send() 之后不再调用 next() |
无法访问服务器 | 端口占用或未启动 | 检查 app.listen() 是否执行、端口是否冲突 |
中间件不生效 | 未调用 next() |
在中间件函数中调用 next() 放行请求 |
八、后续扩展(进阶内容)
- 静态资源中间件 :
app.use(express.static("public"))
- 请求体解析 :
app.use(express.json())
、app.use(express.urlencoded({ extended: true }))
- Cookie / Session 管理
- 模板引擎(EJS、Handlebars)
- MVC 架构整合
总结
- Express 是 Node.js 中最主流的 Web 框架;
- 核心概念:路由 和 中间件;
- 使用
app.listen()
启动服务器; - 理解请求处理链,是掌握 Express 的关键。
推荐阅读
- Express 官方文档
- Node.js 中文网
- 《Node.js 实战(第2版)》