|  |  |  |  | <h1 align="center">Fastify</h1> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Errors
 | 
					
						
							|  |  |  |  | <a id="errors"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### Error Handling In Node.js
 | 
					
						
							|  |  |  |  | <a id="error-handling"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### Uncaught Errors
 | 
					
						
							|  |  |  |  | In Node.js, uncaught errors are likely to cause memory leaks, file descriptor | 
					
						
							|  |  |  |  | leaks, and other major production issues. | 
					
						
							|  |  |  |  | [Domains](https://nodejs.org/en/docs/guides/domain-postmortem/) were a failed | 
					
						
							|  |  |  |  | attempt to fix this. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Given that it is not possible to process all uncaught errors sensibly, the best | 
					
						
							|  |  |  |  | way to deal with them is to | 
					
						
							|  |  |  |  | [crash](https://nodejs.org/api/process.html#process_warning_using_uncaughtexception_correctly). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### Catching Errors In Promises
 | 
					
						
							|  |  |  |  | In Node.js, unhandled promise rejections (that is, without a `.catch()` handler) | 
					
						
							|  |  |  |  | can also cause memory and file descriptor leaks. While `unhandledRejection` is | 
					
						
							|  |  |  |  | deprecated in Node.js, unhandled rejections will not throw, and still | 
					
						
							|  |  |  |  | potentially leak. You should use a module like | 
					
						
							|  |  |  |  | [`make-promises-safe`](https://github.com/mcollina/make-promises-safe) to ensure | 
					
						
							|  |  |  |  | unhandled rejections _always_ throw. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If you are using promises, you should attach a `.catch()` handler synchronously. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### Errors In Fastify
 | 
					
						
							|  |  |  |  | Fastify follows an all-or-nothing approach and aims to be lean and optimal as | 
					
						
							|  |  |  |  | much as possible. The developer is responsible for making sure that the errors | 
					
						
							|  |  |  |  | are handled properly. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### Errors In Input Data
 | 
					
						
							|  |  |  |  | Most errors are a result of unexpected input data, so we recommend [validating | 
					
						
							|  |  |  |  | your input data against a JSON schema](./Validation-and-Serialization.md). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### Catching Uncaught Errors In Fastify
 | 
					
						
							|  |  |  |  | Fastify tries to catch as many uncaught errors as it can without hindering | 
					
						
							|  |  |  |  | performance. This includes: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 1. synchronous routes, e.g. `app.get('/', () => { throw new Error('kaboom') })` | 
					
						
							|  |  |  |  | 2. `async` routes, e.g. `app.get('/', async () => { throw new Error('kaboom') | 
					
						
							|  |  |  |  |    })` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The error in both cases will be caught safely and routed to Fastify's default | 
					
						
							|  |  |  |  | error handler for a generic `500 Internal Server Error` response. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | To customize this behavior you should use | 
					
						
							|  |  |  |  | [`setErrorHandler`](./Server.md#seterrorhandler). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### Errors In Fastify Lifecycle Hooks And A Custom Error Handler
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | From the [Hooks documentation](./Hooks.md#manage-errors-from-a-hook): | 
					
						
							|  |  |  |  | > If you get an error during the execution of your hook, just pass it to
 | 
					
						
							|  |  |  |  | > `done()` and Fastify will automatically close the request and send the
 | 
					
						
							|  |  |  |  | > appropriate error code to the user.
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If you have defined a custom error handler for using `setErrorHandler` the error | 
					
						
							|  |  |  |  | will be routed there. otherwise, it will be routed to Fastify’s generic error | 
					
						
							|  |  |  |  | handler. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Some things to consider in your custom error handler: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | - you can `reply.send(data)`, which will behave as it would in [regular route | 
					
						
							|  |  |  |  |   handlers](./Reply.md#senddata) | 
					
						
							|  |  |  |  |   - objects are serialized, triggering the `preSerialization` lifecycle hook if | 
					
						
							|  |  |  |  |     you have one defined | 
					
						
							|  |  |  |  |   - strings, buffers, and streams are sent to the client, with appropriate | 
					
						
							|  |  |  |  |     headers (no serialization) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | - You can throw a new error in your custom error handler | 
					
						
							|  |  |  |  |   - errors (new error or the received error parameter re-thrown) - will trigger | 
					
						
							|  |  |  |  |     the `onError` lifecycle hook and send the error to the user | 
					
						
							|  |  |  |  |   - an error will not be triggered twice from a lifecycle hook - Fastify | 
					
						
							|  |  |  |  |     internally monitors the error invocation to avoid infinite loops for errors | 
					
						
							|  |  |  |  |     thrown in the reply phases of the lifecycle. (those after the route handler) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### Fastify Error Codes
 | 
					
						
							|  |  |  |  | <a id="fastify-error-codes"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_BAD_URL
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_BAD_URL"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The router received an invalid url. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_ALREADY_PRESENT
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_ALREADY_PRESENT"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The parser for this content type was already registered. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_BODY_TOO_LARGE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_BODY_TOO_LARGE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The request body is larger than the provided limit. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | This setting can be defined in the Fastify server instance: | 
					
						
							|  |  |  |  | [`bodyLimit`](./Server.md#bodylimit) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_EMPTY_TYPE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_EMPTY_TYPE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The content type cannot be an empty string. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_INVALID_CONTENT_LENGTH
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_INVALID_CONTENT_LENGTH"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Request body size did not match Content-Length. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_INVALID_HANDLER
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_INVALID_HANDLER"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | An invalid handler was passed for the content type. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_INVALID_MEDIA_TYPE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_INVALID_MEDIA_TYPE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The received media type is not supported (i.e. there is no suitable | 
					
						
							|  |  |  |  | `Content-Type` parser for it). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_INVALID_PARSE_TYPE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_INVALID_PARSE_TYPE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The provided parse type is not supported. Accepted values are `string` or | 
					
						
							|  |  |  |  | `buffer`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_CTP_INVALID_TYPE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_CTP_INVALID_TYPE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `Content-Type` should be a string. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_DEC_ALREADY_PRESENT
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_DEC_ALREADY_PRESENT"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A decorator with the same name is already registered. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_DEC_MISSING_DEPENDENCY
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_DEC_MISSING_DEPENDENCY"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The decorator cannot be registered due to a missing dependency. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_HOOK_INVALID_HANDLER
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_HOOK_INVALID_HANDLER"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The hook callback must be a function. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_HOOK_INVALID_TYPE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_HOOK_INVALID_TYPE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The hook name must be a string. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_LOG_INVALID_DESTINATION
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_LOG_INVALID_DESTINATION"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The logger accepts either a `'stream'` or a `'file'` as the destination. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_PROMISE_NOT_FULFILLED
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_PROMISE_NOT_FULFILLED"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A promise may not be fulfilled with 'undefined' when statusCode is not 204. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_REP_ALREADY_SENT
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_REP_ALREADY_SENT"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A response was already sent. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_REP_INVALID_PAYLOAD_TYPE
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_REP_INVALID_PAYLOAD_TYPE"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Reply payload can be either a `string` or a `Buffer`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_SCH_ALREADY_PRESENT
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_SCH_ALREADY_PRESENT"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A schema with the same `$id` already exists. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_SCH_MISSING_ID
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_SCH_MISSING_ID"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The schema provided does not have `$id` property. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_SCH_SERIALIZATION_BUILD
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_SCH_SERIALIZATION_BUILD"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The JSON schema provided for serialization of a route response is not valid. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_SCH_VALIDATION_BUILD
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_SCH_VALIDATION_BUILD"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The JSON schema provided for validation to a route is not valid. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_SEND_INSIDE_ONERR
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_SEND_INSIDE_ONERR"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | You cannot use `send` inside the `onError` hook. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### FST_ERR_SEND_UNDEFINED_ERR
 | 
					
						
							|  |  |  |  | <a id="FST_ERR_SEND_UNDEFINED_ERR"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Undefined error has occurred. |