You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					127 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					127 lines
				
				3.4 KiB
			| 
											3 years ago
										 | <h1 align="center">Fastify</h1> | ||
|  | 
 | ||
|  | ## Fluent Schema
 | ||
|  | 
 | ||
|  | The [Validation and | ||
|  | Serialization](../Reference/Validation-and-Serialization.md) documentation | ||
|  | outlines all parameters accepted by Fastify to set up JSON Schema Validation to | ||
|  | validate the input, and JSON Schema Serialization to optimize the output. | ||
|  | 
 | ||
|  | [`fluent-json-schema`](https://github.com/fastify/fluent-json-schema) can be | ||
|  | used to simplify this task while allowing the reuse of constants. | ||
|  | 
 | ||
|  | ### Basic settings
 | ||
|  | 
 | ||
|  | ```js | ||
|  | const S = require('fluent-json-schema') | ||
|  | 
 | ||
|  | // You can have an object like this, or query a DB to get the values | ||
|  | const MY_KEYS = { | ||
|  |   KEY1: 'ONE', | ||
|  |   KEY2: 'TWO' | ||
|  | } | ||
|  | 
 | ||
|  | const bodyJsonSchema = S.object() | ||
|  |   .prop('someKey', S.string()) | ||
|  |   .prop('someOtherKey', S.number()) | ||
|  |   .prop('requiredKey', S.array().maxItems(3).items(S.integer()).required()) | ||
|  |   .prop('nullableKey', S.mixed([S.TYPES.NUMBER, S.TYPES.NULL])) | ||
|  |   .prop('multipleTypesKey', S.mixed([S.TYPES.BOOLEAN, S.TYPES.NUMBER])) | ||
|  |   .prop('multipleRestrictedTypesKey', S.oneOf([S.string().maxLength(5), S.number().minimum(10)])) | ||
|  |   .prop('enumKey', S.enum(Object.values(MY_KEYS))) | ||
|  |   .prop('notTypeKey', S.not(S.array())) | ||
|  | 
 | ||
|  | const queryStringJsonSchema = S.object() | ||
|  |   .prop('name', S.string()) | ||
|  |   .prop('excitement', S.integer()) | ||
|  | 
 | ||
|  | const paramsJsonSchema = S.object() | ||
|  |   .prop('par1', S.string()) | ||
|  |   .prop('par2', S.integer()) | ||
|  | 
 | ||
|  | const headersJsonSchema = S.object() | ||
|  |   .prop('x-foo', S.string().required()) | ||
|  | 
 | ||
|  | // Note that there is no need to call `.valueOf()`! | ||
|  | const schema = { | ||
|  |   body: bodyJsonSchema, | ||
|  |   querystring: queryStringJsonSchema, // (or) query: queryStringJsonSchema | ||
|  |   params: paramsJsonSchema, | ||
|  |   headers: headersJsonSchema | ||
|  | } | ||
|  | 
 | ||
|  | fastify.post('/the/url', { schema }, handler) | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Reuse
 | ||
|  | 
 | ||
|  | With `fluent-json-schema` you can manipulate your schemas more easily and | ||
|  | programmatically and then reuse them thanks to the `addSchema()` method. You can | ||
|  | refer to the schema in two different manners that are detailed in the | ||
|  | [Validation and | ||
|  | Serialization](../Reference/Validation-and-Serialization.md#adding-a-shared-schema) | ||
|  | documentation. | ||
|  | 
 | ||
|  | Here are some usage examples: | ||
|  | 
 | ||
|  | **`$ref-way`**: refer to an external schema. | ||
|  | 
 | ||
|  | ```js | ||
|  | const addressSchema = S.object() | ||
|  |   .id('#address') | ||
|  |   .prop('line1').required() | ||
|  |   .prop('line2') | ||
|  |   .prop('country').required() | ||
|  |   .prop('city').required() | ||
|  |   .prop('zipcode').required() | ||
|  | 
 | ||
|  | const commonSchemas = S.object() | ||
|  |   .id('https://fastify/demo') | ||
|  |   .definition('addressSchema', addressSchema) | ||
|  |   .definition('otherSchema', otherSchema) // You can add any schemas you need | ||
|  | 
 | ||
|  | fastify.addSchema(commonSchemas) | ||
|  | 
 | ||
|  | const bodyJsonSchema = S.object() | ||
|  |   .prop('residence', S.ref('https://fastify/demo#address')).required() | ||
|  |   .prop('office', S.ref('https://fastify/demo#/definitions/addressSchema')).required() | ||
|  | 
 | ||
|  | const schema = { body: bodyJsonSchema } | ||
|  | 
 | ||
|  | fastify.post('/the/url', { schema }, handler) | ||
|  | ``` | ||
|  | 
 | ||
|  | 
 | ||
|  | **`replace-way`**: refer to a shared schema to replace before the validation | ||
|  | process. | ||
|  | 
 | ||
|  | ```js | ||
|  | const sharedAddressSchema = { | ||
|  |   $id: 'sharedAddress', | ||
|  |   type: 'object', | ||
|  |   required: ['line1', 'country', 'city', 'zipcode'], | ||
|  |   properties: { | ||
|  |     line1: { type: 'string' }, | ||
|  |     line2: { type: 'string' }, | ||
|  |     country: { type: 'string' }, | ||
|  |     city: { type: 'string' }, | ||
|  |     zipcode: { type: 'string' } | ||
|  |   } | ||
|  | } | ||
|  | fastify.addSchema(sharedAddressSchema) | ||
|  | 
 | ||
|  | const bodyJsonSchema = { | ||
|  |   type: 'object', | ||
|  |   properties: { | ||
|  |     vacation: 'sharedAddress#' | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | const schema = { body: bodyJsonSchema } | ||
|  | 
 | ||
|  | fastify.post('/the/url', { schema }, handler) | ||
|  | ``` | ||
|  | 
 | ||
|  | NB You can mix up the `$ref-way` and the `replace-way` when using | ||
|  | `fastify.addSchema`. |