Closed
Description
Decision
We've decided to make a major change to support a better developer experience for working with supabase-js. Instead of throwing an error, we will return the error object as part of the response.
Example
Given a successful query, e.g. const response = await supabase.from('products').select('*')
, response
will be:
{
"error": null,
"data": [...],
"status": 200,
"statusCode": 200,
"statusText": "",
"body": [...] // for backwards compatibility: `body === data`
}
Given a bad query, e.g. const response = await supabase.from('productx').select('*')
, response
will be:
{
"error": {
"code": 404,
"message": "relation \"public.productx\" does not exist",
"details": null,
"hint": null
},
"data": null,
"status": 404,
"statusCode": 404,
"statusText": "",
"body": null // for backwards compatibility: `body === data`
}
Future DX
This will enable the following experience:
const { error, data: products } = await supabase.from('products').select('*')
if (error) {
alert(error.message)
return // abort
}
console.log(`Found ${products.length} products.`)
Additional context
Inspiration has been taken from https://github.com/vercel/swr#quick-start:
import useSWR from 'swr'
function Profile() {
const { data, error } = useSWR('/api/user', fetcher)
if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div>
return <div>hello {data.name}!</div>
}
as well as Stripe.js : https://stripe.com/docs/js/payment_methods/create_payment_method