几个月没有使用Express框架开发了,Express版本已经更新到了5.0版本,这次Express.js 5.0版本发布于2024 年 10 月 15 ,距上一次重大更新已有 10 年。它的主要目标是专注于现代化、性能优化和兼容未来的 Node.js 项目,需要 Node.js 18 或更高版本。感兴趣的小伙伴一起来看看吧~
安装Express.js 5.0
要体验新版本,只需运行以下命令:
npm install --save express@next
注意:Express.js 5.0 要求 Node.js 18 或更高版本。如果您还在使用较旧版本,需要提前升级。
Express.js 5.0的核心功能更新
1. 废弃方法与属性
以下方法和属性已经被移除,需要进行相应的代码重构:
app.del()
:替换为更符合现代 JavaScript 标准的app.delete()
。app.param(fn)
:旧版本中支持修改参数的辅助方法,现已完全移除。- 复数化方法:例如
req.acceptsCharset()
改为req.acceptsCharsets()
。 req.param(name)
:移除此方法,需分别使用req.params
、req.body
或req.query
。
2.路由匹配增强
- 支持的新语法:路径匹配中新增
?
、*
和+
参数修饰符。 - 正则表达式更新:路径语法更严格。例如以下例子:
// Express.js 4 的写法
app.get('/user*', (req, res) => res.send('User'));
// Express.js 5 的写法
app.get('/user(.*)', (req, res) => res.send('User'));
3.Promise 错误处理更简化
Express.js 5.0 自动将异步中未捕获的 Promise 错误传递到错误处理中间件,我们无需手动调用 next(err)
。例如以下例子:
// Express.js 5 的写法
app.get('/route', async (req, res, next) => {
const data = await fetchData();
res.send(data);
});
如果 fetchData()
抛出错误,Express 会自动捕获并交给错误处理中间件。
而在旧版本中,开发者必须使用 try/catch
语句,例如下面的:
// Express.js 4 的写法
app.get('/route', async (req, res, next) => {
try {
const result = await fetchData();
res.send(result);
} catch (err) {
next(err);
}
});
4. 最低支持版本升级
Express.js 5.0 不再支持 Node.js 18 以下版本。如果你的项目仍运行在旧版本的 Node.js(如 Node.js 14),请尽快升级。
5. 重新引入 app.router
被 Express.js 4 移除的 app.router
在新版中回归,但以简化形式呈现。它作为基础路由器的引用,无需手动加载。比如下面的例子:
const express = require('express');
const app = express();
const router = express.Router();
router.get('/events', (req, res) => {
res.send('Event list');
});
app.use('/calendar', router);
app.listen(3000, () => console.log('Server running on port 3000'));
6. 严格的错误状态码校验
Express.js 5.0 会强制校验状态码的合法性,避免因非法状态码导致的潜在问题。比如:
res.status(999).send('Invalid status'); // 将抛出错误
7. res.render()
的改进
res.render()
方法全面支持异步操作,防止因旧版视图引擎同步渲染而引发的错误。
8. Body Parser 的更新
- 支持自定义
urlencoded
的深度(默认值:32)。 - 移除已废弃的
bodyParser()
组合中间件。 req.body
不再默认初始化为{}
。urlencoded
解析器的extended
属性默认值变为false
。- 新增 Brotli 支持:引入了 Brotli 压缩算法,提供更高效的无损压缩支持。
生态系统的改进
除了核心功能的更新,Express.js 周边生态也迎来了全面优化:
-
依赖精简:移除了
array-flatten
和path-is-absolute
,改用原生方法如Array.flat()
和path.isAbsolute()
。 -
持续集成优化:新增 Node.js 22 测试支持,提升效率。
-
依赖包更新:如
cookie-parser
、qs
等核心依赖均更新到最新版本。 -
安全提升:新增威胁模型与静态代码安全测试(CodeQL)。
-
OSSF Scorecard:提供开源项目的安全健康评分,推动最佳实践。
实践(第一个Express.js 5.0项目)
1. 初始化项目
1.1 安装 Node.js
确保你的系统安装了 Node.js 18 或更高版本,可以通过以下命令检查:
node -v
1.2 创建项目目录
创建一个新目录作为项目根目录,并初始化package.json
文件:
mkdir express5
cd express5
npm init -y
1.3 安装 Express.js 5.0
执行以下命令,安装最新版本的 Express.js:
npm install express@next
2. 创建项目文件
在项目目录下新建一个 app.js
文件,编写 Express.js 的基本应用代码。
在app.js
文件里,编写如下代码:
// 引入 Express
const express = require('express');
// 创建应用实例
const app = express();
// 定义端口
const PORT = 3000;
// 定义路由
app.get('/', (req, res) => {
res.send('Hello, Express 5.0!');
});
// 启动服务器
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
3. 运行项目
通过以下命令运行项目:
node app.js
打开浏览器访问 http://localhost:3000,你应该会看到页面显示 Hello, Express 5.0!。
4. 实现一个简单的用户 API
在app.js
里添加以下代码:
// 引入 Express
const express = require('express');
// 创建应用实例
const app = express();
const PORT = 3000;
// 使用 JSON 解析中间件
app.use(express.json());
// 模拟的用户数据
let users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 }
];
// 路由 1:获取用户列表
app.get('/users', (req, res) => {
res.json({ success: true, data: users });
});
// 路由 2:获取单个用户详情
app.get('/users/:id', (req, res) => {
const userId = parseInt(req.params.id, 10);
const user = users.find(u => u.id === userId);
if (!user) {
return res.status(404).json({ success: false, message: 'User not found' });
}
res.json({ success: true, data: user });
});
// 路由 3:添加新用户
app.post('/users', (req, res) => {
const { name, age } = req.body;
if (!name || !age) {
return res.status(400).json({ success: false, message: 'Name and age are required' });
}
const newUser = {
id: users.length + 1,
name,
age
};
users.push(newUser);
res.status(201).json({ success: true, data: newUser });
});
// 错误处理中间件,这是一个全局错误处理中间件,如果应用中发生未捕获的错误,它会捕获并返回统一的错误响应。
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ success: false, message: 'Internal Server Error' });
});
// 启动服务器
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
以上代码使用了 express.json()
中间件,这是 Express 提供的内置中间件,用于解析 Content-Type: application/json
的请求体,并将结果存入 req.body
。这在处理 JSON 格式的 POST 请求时非常重要。
定义了一个 GET 路由,路径为 /users
,模拟返回users
数据数组,通过浏览器访问http://localhost:3000/users 可以获取全部用户数据
定义了一个动态路由,路径为 /users/:id
,其中 :id
是动态参数,使用 req.params.id
获取用户请求的 ID
,并查找对应用户,如果用户不存在,则返回 404 状态码和错误信息。通过浏览器访问http://localhost:3000/users/1 可以获取ID为1的用户数据。
定义了一个 POST 路由,路径为 /users
,使用 req.body
获取传入的数据(用户的名字和年龄)。如果参数不完整,返回 400 状态码和错误提示,如果数据有效,生成新用户,并将其添加到 users
数组中,同时返回新用户数据。
此外,还可以添加一些集成工具,例如Nodemon,提高我们的开发效率
//安装并使用 nodemon,可以自动重启服务器:
npm install --save-dev nodemon
在 package.json
中添加启动脚本:
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
运行项目时,直接使用npm run dev
命令。
还可以集成一些模版引擎,比如:EJS。
- 安装EJS
npm install ejs
- 配置模板引擎:
app.set('view engine', 'ejs');
- 创建视图文件并渲染
app.get('/home', (req, res) => {
res.render('index', { title: 'Home Page' });
});
通过以上例子可以看出,如果之前了解或使用过 Express 框架,那么上手 Express 5.0 将会非常轻松。
总结
Express.js 5.0通过一系列优化与更新,为未来的 Node.js 项目开发奠定了坚实基础。借助自动化错误处理、更严格的路由匹配以及现代化的 API,Express.js 5.0 为开发者提供了更高效、更安全的开发体验。
评论(0)