Best practices for handling planetscale DatabaseErrors with Drizzle?
How are you meant to catch certain/expected DB errors in your server code? This would be useful, for instance, to repeat insertion with a different ID if a user already exists.
import { DatabaseError } from '@planetscale/database';// ...try { const isUserCreated = await this._userService.signUp(body); return Respond.success(isUserCreated, { code: HTTPStatusCodes.Created201 });} catch (e) { if (e instanceof ApiError) { return Respond.error(e.code, e.message, { details: e.details }); } else if (e instanceof DatabaseError) { switch (e.status) { /* <- Is this the Mysql error code? */ case MySQLErrorCodes.ER_DUP_ENTRY: // retry x times break; default: return Respond.serverError('An error occured in the database', { details: e.body }); } } console.error(e); return Respond.serverError('Unknown server error', e ? { details: e } : undefined);}
import { DatabaseError } from '@planetscale/database';// ...try { const isUserCreated = await this._userService.signUp(body); return Respond.success(isUserCreated, { code: HTTPStatusCodes.Created201 });} catch (e) { if (e instanceof ApiError) { return Respond.error(e.code, e.message, { details: e.details }); } else if (e instanceof DatabaseError) { switch (e.status) { /* <- Is this the Mysql error code? */ case MySQLErrorCodes.ER_DUP_ENTRY: // retry x times break; default: return Respond.serverError('An error occured in the database', { details: e.body }); } } console.error(e); return Respond.serverError('Unknown server error', e ? { details: e } : undefined);}
Problem is, unlike Prisma, I don't seem to be able to access a mysql error code, all I get is an error message string like