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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。