# Error Handling
Errors emitted by the API follow the JSON API error format (opens new window). An example of an emitted error follows:
{
"errors": [
{
"code": "ERROR_MIN_LENGTH",
"meta": {
"minLength": 8,
},
"source": {
"parameter": "password",
},
"title": "Password must be at least 8 characters.",
},
{
"code": "ERROR_MATCH_FIELD",
"meta": {
"matchField": "password",
},
"source": {
"parameter": "password_repeat",
},
"title": "Passwords must match.",
},
],
}
The above example represents a user creation form that failed validation. The password
parameter did not meet the complexity requirements (minimum 8 characters in length), and the password_repeat
parameter did not match the password
parameter.
The code
field is a string constant that can be found in wood/lib/Errors
and is safe to perform comparisons against, while title
is a descriptive string that is safe to display to the user, but is not safe to perform comparisons against, as it may change.
The source
field can be used to identify what form field caused the error, and the display the error next to said field. meta
is an optional field that can be used to add extra information to the error, as necessary.
# StandardErrors
Also defined in wood/lib/Errors
are a series of errors:
Standard400Error
: A form validation or other user error.Standard401Error
: The user has not provided correct authentication.Standard403Error
: The user is authenticated, but does not have access to the requested resource.Standard404Error
: The request the user is asking for cannot be found.
These errors all follow the same format when created, an array of objects that match the above-mentioned JSON API error format:
throw new Standard400Error([{
code: ERROR_UNIQUE,
title: 'You already have a project with that name.',
source: { parameter: 'name' },
}]);
As these errors all follow the same format, they are exported handled by the same middleware that catches errors of this type and handles outputting the response of the request. To add more errors to this list, add them to the Standard4xxErrors
exported by app/lib/Errors
:
const { Standard4xxErrors } = require('@wood/lib/Errors');
module.exports = {
Standard4xxErrors: [
...Standard4xxErrors,
'Standard420Error',
],
};
# Display Errors in UI
The simplest way to display errors is to display them in a toast:
import { errorToast } from '#ui/lib/toast';
// ...
try {
doSomethingThatCanThrowAnError();
}
catch (error) {
errorToast(error.message);
}
However, if you are using Validators for a form, you can rely on the global errorCaptured
handler in App.vue
, which will attempt to parse any API errors and store them in the apiErrors
field in the data
section of your component. Then, if using a component that binds to apiErrors
or if manually displaying your apiErrors
in your component, any errors returned from the server will "magically" appear in the correct spot on the form.
You can add a manual try/catch
around your code if you want to do something special on error handling, but remember to re-throw the error if you still want it to end up being parsed and sorted into the correct apiErrors entry.
A note on error format: if you want to automatically have your error sorted into the correct apiErrors field, you have to have a source.parameter
set in the error object:
throw new Standard400Error([{
code: ERROR_EMPTY,
title: 'You must enter your name.',
source: { parameter: 'name' },
}]);
Errors that do not have a source.parameter
field set will instead be displayed as an error toast. So if you are returning an error that doesn't have a specific field that it lines up with (say, because a 3rd-party API call failed, for example), no worries! Just omit the source
parameter entirely and it will still be displayed.