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

发布: (2025年12月5日 GMT+8 18:52)
3 min read
原文: Dev.to

Source: Dev.to

Standardizing Express.js 错误处理的封面图片

如果你已经使用 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);
});

优雅的关闭 🛑

它还能处理进程级错误(uncaughtExceptionunhandledRejection),并在崩溃前让你优雅地关闭数据库连接。

import { initGlobalHandlers } from 'ds-express-errors';

initGlobalHandlers({
  onCrash: () => {
    db.disconnect();
    server.close();
  }
});

📦 如何使用?

安装方式很普通:

npm install ds-express-errors

📚 文档

完整的文档站点提供了高级用法、API 参考以及更多示例:

👉 ds-express-errors.dev

结论

构建这个库帮助我统一了后端项目的错误处理方式,也希望它能对你有所帮助。它完全使用 TypeScript 编写,轻量且可直接用于生产环境。

试一试吧,并告诉我你的使用感受!如果能在 GitHub 仓库 给点反馈或点星,我将不胜感激。 ❤️

Back to Blog

相关文章

阅读更多 »

完整 REDUX 内部

Redux 内部流程图 ┌─────────────────────────────┐ │ 你的组件 │ │ dispatchaction │ └───────────────...