This blog article will illustrate how the various error or status codes are handled in Open Event Frontend, and how the appropriate response is generated corresponding to those error codes. Open Event Frontend, relies on Open Event Server for all server operations. Open Event Server exposes a well documented JSON:API Spec Compliant REST API. The clients using the api primarily interact with it using GET, POST , PATCH and DELETE requests. And thus for each request the API returns corresponding data as response along with it’s status code.
For instance whenever the app opens, for the landing page, all the events are fetched by making a GET request to the end point v1/events. If the request is successful and events data is returned, the status code is 200 which stands for OK in the http standard set by IANA.
Since Open Event server is compliant with JSON:API Spec, to quote it’s official documentation, “Error objects MUST be returned as an array keyed by errors in the top level of a JSON API document.” Thus whenever there is an error, or the request is unsuccessful due to a variety of reasons, the server has a predefined format to convey the information to the front end.
The process is illustrated by the reset password form on open event frontend. When a user forgets his password, he/she has the option to reset it, using his email address. Thus the form just takes in the email address of the user and makes a POST request to the reset-password API endpoint of the server.
- Once the request is made there are 3 possibilities (check references for error code significance):
The request is successful and a status code of 200 is returned. - The email address user entered doesn’t exists and no record is found in the database. 422 status code should be returned.
- The server is down, or the request is invalid (something unexpected has occurred). In all such scenarios error code 404 should be returned.
this.get('loader') .post('auth/reset-password', payload) .then(() => { this.set('successMessage', this.l10n.t('Please go to the link sent to your email to reset your password')); }) .catch(reason => { if (reason && reason.hasOwnProperty('errors') && reason.errors[0].status === 422) { this.set('errorMessage', this.l10n.t('No account is registered with this email address.')); } else { this.set('errorMessage', this.l10n.t('An unexpected error occurred.')); } }) .finally(()=> { this.set('isLoading', false); } );
Thus as mentioned in the JSON:API docs, the errors property is expected to contain the status code and error message(optional) , which ember handles via the the catch block. The catch block is executed whenever the response from the request is not successful. The contents of the response are present in the reason property. If the status of the error is 422, the corresponding message is stored inside the errorMessage property of the component which is further used to display the alert by rendering an error block on the forgot password form.
In case there is no error, the errorMessage is undefined, and the error block is not rendered at all. In case of any other unexpected error, the standard text is displayed by initialising the errorMessage property to it.
Resources
- JSON:API Spec – Official Documentation of JSON:API spec Error handling
- HTTP Status Codes – Status codes and their significance
- Reset Password Form Source Code – Complete source code of the reset password form