async函数支持

Express5.x版本对async/await语法提供了更好的支持,这是相比4.x版本的一个重要改进。在Express4.x中,如果在路由处理函数中使用async函数并且抛出异常,错误不会被自动捕获,需要手动使用try/catch或借助第三方中间件来处理。而在Express5.x中,框架原生支持了对async函数错误的自动捕获,大大简化了异步代码的编写。

async处理函数

Express5.x原生支持async函数,我们直接使用无需特殊设置。此外,当async路由处理函数或中间件抛出异常或返回被拒绝的Promise时,错误会自动传递给next()函数,从而被错误处理中间件捕获。

import express from "express";

const app = express();

// 模拟数据库查询函数
const getUserById = async (id) => {
  if (id === "error") {
    throw new Error("用户不存在");
  }
  return { id, name: "张三", email: "zhangsan@example.com" };
};

// async处理函数
app.get("/user/:id", async (req, res) => {
  const user = await getUserById(req.params.id);
  res.json(user);
});

// 错误处理中间件可以自动捕获async处理函数中的错误
app.use((err, req, res, next) => {
  console.error("捕获到错误:", err.message);
  res.status(500).json({ message: err.message });
});

app.listen(3000, () => {
  console.log("服务器运行在 http://localhost:3000");
});

运行上述代码后,访问http://localhost:3000/user/1将正常返回用户信息,而访问http://localhost:3000/user/error时抛出的异常会被错误处理中间件自动捕获并返回错误响应。

async中间件

Express5.x对async函数的支持同样适用于中间件。

import express from "express";

const app = express();

// 模拟异步认证函数
const verifyToken = async (token) => {
  if (!token) {
    throw new Error("未提供认证令牌");
  }
  if (token !== "valid-token") {
    throw new Error("无效的认证令牌");
  }
  return { userId: 1, username: "admin" };
};

// async中间件
const authMiddleware = async (req, res, next) => {
  const token = req.headers.authorization;
  const user = await verifyToken(token);
  req.user = user;
  next(); // 验证通过,继续执行下一个中间件
};

// 受保护的路由
app.get("/profile", authMiddleware, (req, res) => {
  res.json({ message: "欢迎访问个人主页", user: req.user });
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error("认证错误:", err.message);
  res.status(401).json({ message: err.message });
});

app.listen(3000, () => {
  console.log("服务器运行在 http://localhost:3000");
});
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。