使用 Express 处理 Prisma 错误

con*_*cus 6 backend node.js express typescript prisma

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

我知道我可以使用tryand catch,但这感觉没有必要,因为我可以使用错误处理程序更好地处理这个问题,特别是当大量有关错误的信息通过 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;
Run Code Online (Sandbox Code Playgroud)

这对于正常错误来说效果很好,但对于 Prisma 错误则不会执行,而只会导致 Node 应用程序崩溃。

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

Man*_*han 6

我今天遇到了这个问题,我也找不到答案。我相信我们必须为 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
}
Run Code Online (Sandbox Code Playgroud)

还,

// 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.

Run Code Online (Sandbox Code Playgroud)

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

  • @SamTheFam 看看这个 https://www.npmjs.com/package/express-async-errors (2认同)