使用 Express 处理 Prisma 错误

Posted

技术标签:

【中文标题】使用 Express 处理 Prisma 错误【英文标题】:Handle Prisma errors with Express 【发布时间】:2021-08-05 08:43:52 【问题描述】:

我在使用 ExpressJS 和 Prisma 处理错误时遇到了一些问题。每当发生 Prisma 异常时,我的整个 Node 应用程序都会崩溃,我必须重新启动它。我做了一些谷歌搜索并查看了Prisma Docs 的错误处理,但我找不到任何答案。

我知道我可以使用 trycatch,但这感觉没有必要,因为我可以使用错误处理程序更好地处理这个问题,尤其是当大量有关错误的信息通过 Prisma 传递时。

我曾尝试像这样实现 Express 错误处理程序:

// index.ts

import errorHandler from "./middleware/errorHandler";
...
server.use(errorHandler);

// errorHandler.ts

import  NextFunction, Response  from "express";

// ts-ignore because next function is required for some weird reason
// @ts-ignore
const errorHandler = (err: any, _: any, res: Response, next: NextFunction) => 
    console.error(err.stack);
    res.status(500).send("Internal Server Error");
;

export default errorHandler;

这适用于正常错误,但不会针对 Prisma 错误执行,而只会使 Node 应用程序崩溃。

如何实现错误处理程序以便管理 Prisma Expections?

【问题讨论】:

【参考方案1】:

我今天遇到了这个问题,我也找不到答案。我相信我们必须为 Prisma 异常编写自己的自定义错误处理程序,而不是抛出错误。

try 
  await prismaOperation();
 catch(e) 
  throw e; // avoid this which will crash our app
  /* Process Prisma error with error codes
     and prepare an appropriate error message
  */
  const error = prismaCustomErrorHandler(e);
  res.send(error); // Sending response instead of passing it to our default handler

还有,

// ts-ignore 因为某些奇怪的原因需要下一个函数

在 Express 中,错误处理函数有 4 个参数而不是 3 个:(err, req, res, next)

Express 将带有 3 个参数的中间件函数解释为 (req, res, next),这与您省略了第 4 个参数 (err, _, res) 不同。因此,Express 不会传递任何错误,您的 err 将是一个 req 对象、_ (req) 一个 res 对象和 res 一个 next 函数。

编辑:

...
const error = prismaCustomErrorHandler(e);
  res.send(error); // Sending response instead of passing it to our default handler
...

// Edit: Or you could process and pass the error using `next(error)` to default error handler.

上述方法不会使应用程序崩溃并且确实会发送响应。但是无论你使用next还是res.send,都必须处理错误。

【讨论】:

@SamTheFam 看看这个npmjs.com/package/express-async-errors

以上是关于使用 Express 处理 Prisma 错误的主要内容,如果未能解决你的问题,请参考以下文章

节点 express-graphql 应用程序中使用的 Prisma 2 DateTime 字段

将 Prisma GraphQL-Yoga 用作 Express/Node 应用程序:如何在服务器端调用 GraphQL 突变?

用另一层 node express 镜像扩展 prisma Docker 镜像

React:使用 API 从 Prisma 获取数据时出现未处理的错误 500

使用 nexus-prisma graphql 处理文件上传

快速错误处理和异步等待