Fastify

Fluent Schema

验证和序列化一文中,我们列明了使用 JSON schema 验证输入、优化输出时所有可用的参数。

现在,你可以使用 fluent-json-schema 来更简单地设置 JSON schema,并且复用常量。

基本设置

  1. const S = require('fluent-json-schema')
  2. // 你可以使用如下的一个对象,或查询数据库来获取数据
  3. const MY_KEYS = {
  4. KEY1: 'ONE',
  5. KEY2: 'TWO'
  6. }
  7. const bodyJsonSchema = S.object()
  8. .prop('someKey', S.string())
  9. .prop('someOtherKey', S.number())
  10. .prop('requiredKey', S.array().maxItems(3).items(S.integer()).required())
  11. .prop('nullableKey', S.mixed([S.TYPES.NUMBER, S.TYPES.NULL]))
  12. .prop('multipleTypesKey', S.mixed([S.TYPES.BOOLEAN, S.TYPES.NUMBER]))
  13. .prop('multipleRestrictedTypesKey', S.oneOf([S.string().maxLength(5), S.number().minimum(10)]))
  14. .prop('enumKey', S.enum(Object.values(MY_KEYS)))
  15. .prop('notTypeKey', S.not(S.array()))
  16. const queryStringJsonSchema = S.object()
  17. .prop('name', S.string())
  18. .prop('excitement', S.integer())
  19. const paramsJsonSchema = S.object()
  20. .prop('par1', S.string())
  21. .prop('par2', S.integer())
  22. const headersJsonSchema = S.object()
  23. .prop('x-foo', S.string().required())
  24. const schema = {
  25. body: bodyJsonSchema,
  26. querystring: queryStringJsonSchema, // (或) query: queryStringJsonSchema
  27. params: paramsJsonSchema,
  28. headers: headersJsonSchema
  29. }
  30. fastify.post('/the/url', { schema }, handler)

复用

使用 fluent-json-schema,你可以简单且程序化地处理 schema,并通过 addSchema() 来复用它们。 正如验证和序列化一文所述,有两种方法来引用 schema。

以下是一些例子:

使用$ref:引用外部的 schema。

  1. const addressSchema = S.object()
  2. .id('#address')
  3. .prop('line1').required()
  4. .prop('line2')
  5. .prop('country').required()
  6. .prop('city').required()
  7. .prop('zipcode').required()
  8. const commonSchemas = S.object()
  9. .id('https://fastify/demo')
  10. .definition('addressSchema', addressSchema)
  11. .definition('otherSchema', otherSchema) // 你可以任意添加需要的 schema
  12. fastify.addSchema(commonSchemas)
  13. const bodyJsonSchema = S.object()
  14. .prop('residence', S.ref('https://fastify/demo#address')).required()
  15. .prop('office', S.ref('https://fastify/demo#/definitions/addressSchema')).required()
  16. const schema = { body: bodyJsonSchema }
  17. fastify.post('/the/url', { schema }, handler)

替换方式:在验证阶段之前,使用共用 schema 替换某些字段。

  1. const sharedAddressSchema = {
  2. $id: 'sharedAddress',
  3. type: 'object',
  4. required: ['line1', 'country', 'city', 'zipcode'],
  5. properties: {
  6. line1: { type: 'string' },
  7. line2: { type: 'string' },
  8. country: { type: 'string' },
  9. city: { type: 'string' },
  10. zipcode: { type: 'string' }
  11. }
  12. }
  13. fastify.addSchema(sharedAddressSchema)
  14. const bodyJsonSchema = {
  15. type: 'object',
  16. properties: {
  17. vacation: 'sharedAddress#'
  18. }
  19. }
  20. const schema = { body: bodyJsonSchema }
  21. fastify.post('/the/url', { schema }, handler)

特别注意:你可以在 fastify.addSchema 方法里混用 $ref替换方式