使用 Express 处理 Prisma 错误
Posted
技术标签:
【中文标题】使用 Express 处理 Prisma 错误【英文标题】:Handle Prisma errors with Express 【发布时间】:2021-08-05 08:43:52 【问题描述】:我在使用 ExpressJS 和 Prisma 处理错误时遇到了一些问题。每当发生 Prisma 异常时,我的整个 Node 应用程序都会崩溃,我必须重新启动它。我做了一些谷歌搜索并查看了Prisma Docs 的错误处理,但我找不到任何答案。
我知道我可以使用 try
和 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;
这适用于正常错误,但不会针对 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