首页
Preview

Express.js 5.0新特性:十年磨一剑,带来全新升级!

几个月没有使用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.paramsreq.bodyreq.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-flattenpath-is-absolute,改用原生方法如 Array.flat() path.isAbsolute()

  • 持续集成优化:新增 Node.js 22 测试支持,提升效率。

  • 依赖包更新:如 cookie-parserqs 等核心依赖均更新到最新版本。

  • 安全提升:新增威胁模型与静态代码安全测试(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!。

image.png

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 为开发者提供了更高效、更安全的开发体验。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
Hedy
大家好!我是一位前端开发工程师,拥有6年以上的前端开发经验。我熟练掌握HTML、CSS、JavaScript等语言,能够灵活运用各种前端框架,如Vue、React、Uniapp、Flutter等。我注重理论与实践相结合,能够为学员提供丰富的案例和实践项目,并以生动、易懂的语言为学员讲解前端开发的核心知识和技能。我不仅注重传授技能,更关注学员的职业发展,希望通过我的教学,帮助学员成为一名优秀的前端开发工程师。

评论(0)

添加评论