blog image

Better Prisma Error Handling with Prisma Better Errors package

As a developer, you know that handling errors is an essential part of building robust and reliable applications. However, when it comes to dealing with errors thrown by Prisma ORM, things can get a bit tricky. By default, Prisma throws errors with error codes that can be hard to understand for developers who are not familiar with them. This can make it challenging to identify and fix errors quickly, leading to delays and frustration for developers.

This is where Prisma Better Errors come in. Prisma Better Errors is a module that provides a way to handle errors thrown by Prisma ORM in a more descriptive way. By mapping Prisma error codes to error messages and HTTP status codes, developers can understand what went wrong and return appropriate error responses in their APIs.

Solution: Prisma Better Errors

Fortunately, there is a solution to this problem in the form of a module called prisma-better-errors. This module provides a way to handle errors thrown by Prisma in a more descriptive way. By default, Prisma throws errors with error codes that can be hard to understand for developers not familiar with the specific error codes used by Prisma. This module maps Prisma error codes to error messages and HTTP status codes, making it easier for developers to understand what went wrong and return appropriate error responses in their APIs.

Benefits of Using Prisma Better Errors

By using prisma-better-errors, developers can benefit in several ways:

  1. More descriptive error messages: With prisma-better-errors, developers get more descriptive error messages when something goes wrong with their Prisma queries. This makes it easier for developers to understand what went wrong and take appropriate actions.

  2. Easier error handling: prisma-better-errors maps Prisma error codes to HTTP status codes, making it easier for developers to return appropriate error responses in their APIs. This helps reduce the amount of time and effort required to handle errors in their code.

  3. Customizable error messages: prisma-better-errors allows developers to customize the error message and HTTP status code for each Prisma error code by modifying the QueryError map in the module. This provides developers with greater control over the error messages returned by their APIs.

How to install and use Prisma Better Errors

Installing Prisma Better Errors is a simple process. You can use npm to install it by running the following command:

npm install prisma-better-errors

Once you have installed the module, you can start using it in your code. Here's an example of how to use it with an async function that fetches a user from the database:

import { PrismaClient } from '@prisma/client'; import { prismaError } from 'prisma-better-errors'; const prisma = new PrismaClient(); async function getUser(id: number) { try { const user = await prisma.user.findUnique({ where: { id } }); return user; } catch (error) { throw new prismaError(error); } }

In this example, we are using the prismaError class to catch and handle errors thrown by Prisma ORM. The prismaError class extends the built-in Error class and adds three properties: message, statusCode, and metaData.

To use Prisma Better Errors in your error handling middleware with Express, you can add the prismaError class to your middleware and return the statusCode and title properties as part of the API error response. Here's an example:

app.use((err, req, res, next) => { if (err instanceof prismaError) { res.status(err.statusCode).json({ title: err.title, message: err.message, metaData: err.metaData, }); } else { // Handle other errors here } });

How to Use Prisma Better Errors

Using prisma-better-errors is quite simple. After installing the module using npm, developers can import the prismaError class and use it to catch Prisma errors in their code. Here's an example:

import { PrismaClient } from '@prisma/client'; import { prismaError } from 'prisma-better-errors'; const prisma = new PrismaClient(); async function getUser(id: number) { try { const user = await prisma.user.findUnique({ where: { id } }); return user; } catch (error) { throw new prismaError(error); } }

In this example, the getUser function tries to fetch a user from the database using Prisma's findUnique method. If an error is thrown, the prismaError class is used to wrap the error and provide a more descriptive error message and HTTP status code.

With express middleware

Add the prismaError class to your error handling middleware and return the statusCode and title properties as part of the API error response. The metaData property can also be returned if it contains any additional information about the error.

app.use((err, req, res, next) => { if (err instanceof prismaError) { res.status(err.statusCode).json({ title: err.title, message: err.message, metaData: err.metaData, }); } else { // Handle other errors here } });
// response { "title": "Prisma Error", "statusCode": 409, "message": "Unique constraint failed", "metaData": { "target": [ "email" ] } }