流畅结构
流畅结构
¥Fluent Schema
验证和序列化 文档概述了 Fastify 接受的所有参数,用于设置 JSON Schema Validation 来验证输入,以及 JSON Schema Serialization 来优化输出。
¥The Validation and Serialization 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
可用于简化此任务,同时允许重用常量。
¥fluent-json-schema
can be
used to simplify this task while allowing the reuse of constants.
基本设置
¥Basic settings
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
使用 fluent-json-schema
,你可以更轻松地以编程方式操作模式,然后借助 addSchema()
方法重用它们。你可以通过 验证和序列化 文档中详述的两种不同方式引用架构。
¥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
documentation.
以下是一些使用示例:
¥Here are some usage examples:
$ref-way
:参考外部模式。
¥$ref-way
: refer to an external schema.
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
:在验证过程之前引用要替换的共享架构。
¥replace-way
: refer to a shared schema to replace before the validation
process.
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 使用 fastify.addSchema
时,你可以混合使用 $ref-way
和 replace-way
。
¥NB You can mix up the $ref-way
and the replace-way
when using
fastify.addSchema
.