61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
/**
|
|
* Error format
|
|
*
|
|
* Returned by every PostgREST request that fails. When something fails, the
|
|
* single most useful field is usually `hint` — Postgres often returns the
|
|
* actionable fix there, not in `message`. Always log the full object (e.g.
|
|
* `console.error(error)`); logging only `error.message` hides the hint.
|
|
*
|
|
* Read the fields in roughly this order of usefulness:
|
|
*
|
|
* - `hint` — actionable guidance from the database when available. For
|
|
* permission-denied errors (`42501`), this is the literal SQL to fix the
|
|
* problem, e.g.
|
|
* `"Grant the required privileges to the current role with: GRANT SELECT ON public.users TO anon;"`.
|
|
* Missing column? `hint` suggests the column you probably meant. Whenever
|
|
* Postgres knows the fix, it puts it in `hint`.
|
|
* - `code` — stable error code from PostgREST (e.g. `PGRST301`) or Postgres
|
|
* (e.g. `42501`). Branch on this rather than on `message` text.
|
|
* - `details` — extra context, often the offending value, key, or row.
|
|
* - `message` — human-readable summary. Useful in UI strings; less useful
|
|
* for debugging.
|
|
*
|
|
* {@link https://postgrest.org/en/stable/api.html?highlight=options#errors-and-http-status-codes}
|
|
*/
|
|
export default class PostgrestError extends Error {
|
|
details: string
|
|
hint: string
|
|
code: string
|
|
|
|
/**
|
|
* @example
|
|
* ```ts
|
|
* import PostgrestError from '@supabase/postgrest-js'
|
|
*
|
|
* throw new PostgrestError({
|
|
* message: 'Row level security prevented the request',
|
|
* details: 'RLS denied the insert',
|
|
* hint: 'Check your policies',
|
|
* code: 'PGRST301',
|
|
* })
|
|
* ```
|
|
*/
|
|
constructor(context: { message: string; details: string; hint: string; code: string }) {
|
|
super(context.message)
|
|
this.name = 'PostgrestError'
|
|
this.details = context.details
|
|
this.hint = context.hint
|
|
this.code = context.code
|
|
}
|
|
|
|
toJSON(): { name: string; message: string; details: string; hint: string; code: string } {
|
|
return {
|
|
name: this.name,
|
|
message: this.message,
|
|
details: this.details,
|
|
hint: this.hint,
|
|
code: this.code,
|
|
}
|
|
}
|
|
}
|