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
						
					
					
				<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`.
 |