在 Node.js 中,如果直接使用原生的 http
模块来编写 Web 服务器,虽然可以实现基本的请求和响应处理,但代码会变得非常繁琐。
例如,你需要手动解析请求体、拼接路由、设置各种响应头和状态码,代码可读性和维护性都不高。在实际项目开发中,绝大多数开发者都会选择基于成熟的 Web 框架进行开发。这样不仅可以极大提升开发效率,还能让项目结构更加清晰、易于扩展和维护。
主流 Node.js Web 框架
目前在 Node.js 生态中,最流行的两个 Web 框架分别是:
- Express:老牌、功能丰富、易用性强,内置常用中间件,社区活跃,文档完善。
- Koa:由 Express 原班人马打造,更加轻量和现代化,极简核心,所有功能都通过中间件按需加载。
Express 和 Koa 的底层原理是一致的,都是基于“中间件(middleware)”机制来处理请求和响应。
主要区别在于:Express 内置了许多常用功能和中间件;而 Koa 只保留最核心的部分,其他功能都需要开发者自行选择并安装相应的中间件。
什么是中间件?
中间件(Middleware)是 Web 框架的核心概念。本质上,中间件就是一系列函数,这些函数在请求到达最终处理逻辑之前,对请求和响应进行加工处理。比如:
- 解析请求体(如 JSON、表单数据)
- 处理跨域(CORS)
- 记录日志
- 权限校验
- 统一错误处理
中间件的典型特征:
- 每个中间件函数可以访问请求对象(
req
)、响应对象(res
)以及下一个中间件的函数(next
)。 - 可以通过链式调用的方式,将多个中间件组合在一起,形成灵活的处理流程。
- 大部分通用功能都可以借助框架自带或社区中间件实现,无需重复造轮子。
初体验
npm install express
main.js
// 导入express
import express from 'express';
// 创建express实例
const app = express();
// 创建后端路由
// 如果访问了不存在的路由或使用了未被支持的请求方式,Express 会自动处理,返回错误状态码(通常是 404)和简单的错误页面。
// 在express中,每个路由和请求方法的处理都是分开的。
// 不需要像 原生http模块那样 把所有的逻辑放在一个回调函数中
app.post('/login', (req, res) => {
// 返回响应体,并结束请求 「 Content-Type 的值为 text/plain 」
res.end('login');
});
// 回调函数也可以接收 请求体对象 和 响应体对象
// 他们是基于原生http模块的 请求体对象 和 响应体对象 并进行了功能扩展
app.get('/products', (req, res) => {
const products = [
{ id: 1, name: 'iphone', price: 1000 },
{ id: 2, name: 'ipad', price: 2000 },
{ id: 3, name: 'macbook', price: 3000 },
]
// 1. 自动设置响应头 Content-Type: application/json
// 2. 自动将对象转换为 JSON 字符串
// 3. 自动设置状态码 200
// 4. 返回响应体,并结束请求
res.json(products)
});
// 假设请求路径为 /profile/123?name=张三&age=20
app.get('/profile/:id', (req, res) => {
// 获取请求参数
const id = req.params.id // => 123
const query = req.query // => { name: '张三', age: '20' }
res.json({
id,
query,
})
})
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
脚手架工具推荐
为了快速搭建项目结构,Express 和 Koa 都有对应的项目生成器(脚手架):
-
express-generator(官方)
命令行工具:express
,用法示例:npx express my-app
这会自动生成一个标准的 Express 项目骨架。
-
koa-generator(社区)
命令行工具:koa
,用法示例:npx koa my-koa-app
具体使用方法和参数说明,可查阅各自的官方文档。