使用单一库实现 Express.js 错误处理的标准化
Source: Dev.to

如果你已经使用 Express.js 一段时间,你一定体会过其中的痛点。你启动一个项目,随后你的控制器会变成这样:
// The "Bad" Way
app.post('/users', async (req, res) => {
try {
// ... logic
} catch (error) {
console.error(error);
if (error.code === 'P2002') { // Prisma unique constraint
return res.status(400).json({ message: 'User already exists' });
}
// ... 10 more if/else checks
res.status(500).json({ message: 'Something went wrong' });
}
});
这非常重复、难以维护,而且容易出错。我已经厌倦了在项目之间复制粘贴错误处理逻辑,于是我构建了一个一次性解决的工具。
认识一下 ds-express-errors。
它是什么?
ds-express-errors 是一个面向 Node.js 与 Express 的集中式、类型安全的错误处理库。它用简洁的声明式 API 替代手动的 try‑catch 块和状态码管理。
开箱即用的预设 🛠️
不必再记 “Forbidden” 是 401 还是 403。直接使用预设即可。
import { Errors } from 'ds-express-errors';
if (!user) {
throw Errors.NotFound('User not found'); // 自动返回 404
}
if (!user.hasAccess) {
throw Errors.Forbidden('Access denied'); // 自动返回 403
}
自动映射(魔法 🪄)
如果你使用 Zod、Prisma 或 Mongoose,库会自动检测它们的原生错误并转换为可读的 HTTP 400 Bad Request。
使用 Zod 的示例
输入(无效)
{ "email": "invalid-email" }
输出(自动)
{
"status": "fail",
"method": "GET",
"url": "/login",
"message": "Validation error: email: Invalid email",
"stack": "..." // 当 NODE_ENV=development 时显示
}
再见 try/catch
配合内置的 asyncHandler,你的控制器可以再次保持简洁。
import { asyncHandler, Errors } from 'ds-express-errors';
const createUser = asyncHandler(async (req, res) => {
const user = await db.create(req.body); // 如果抛错,会自动被处理!
res.json(user);
});
优雅的关闭 🛑
它还能处理进程级错误(uncaughtException、unhandledRejection),并在崩溃前让你优雅地关闭数据库连接。
import { initGlobalHandlers } from 'ds-express-errors';
initGlobalHandlers({
onCrash: () => {
db.disconnect();
server.close();
}
});
📦 如何使用?
安装方式很普通:
npm install ds-express-errors
📚 文档
完整的文档站点提供了高级用法、API 参考以及更多示例:
结论
构建这个库帮助我统一了后端项目的错误处理方式,也希望它能对你有所帮助。它完全使用 TypeScript 编写,轻量且可直接用于生产环境。
试一试吧,并告诉我你的使用感受!如果能在 GitHub 仓库 给点反馈或点星,我将不胜感激。 ❤️