如何在Fastify中使用fluent-json-schema合并多个路由参数Schema?
Fastify合并参数Schema实现代码复用
问题
我正在给Fastify写路由,想通过合并现有Schema来复用代码、减少冗余。怎么把下面两个参数Schema合并成一个CombinedParams?
const Dataset = S.object() .prop('dataset', S.string().enum(datasetsNames) ) .default('default') .required(); const Locations = S.object() .prop('locations', S.string()) const CombinedParams = S.object()//...COMBINE Locations and Dataset...??? const schemas = { schemaDatasetParams: { description: 'schema having only Dataset', query: ..., params: Dataset, }, schemaDatasetLocationsParams: { description: 'schema having a comination of Locations and Dataset', query: ..., params: CombinedParams } }
解决办法
看你用的是Fastify里常用的哪种Schema工具,分两种情况处理:
1. 使用Joi(你的S是Joi实例)
Joi自带concat()方法可以直接合并两个对象Schema,一行代码就能搞定:
const CombinedParams = Dataset.concat(Locations);
合并后的CombinedParams会同时包含dataset(保留原有的枚举、默认值、必填约束)和locations字段,原Schema的所有规则都会继承下来。
2. 使用TypeBox(你的S是TypeBox的Type对象)
TypeBox通过Intersect类型来合并多个对象Schema:
import { Type } from '@sinclair/typebox'; const CombinedParams = Type.Intersect([Dataset, Locations]);
这种方式会把两个对象的字段合并成一个新对象,各自的约束条件也会完整保留。
小提醒
如果两个Schema存在同名字段,合并时后面的Schema规则会覆盖前面的(比如若Dataset和Locations都有dataset字段,Locations的规则会替换Dataset的原有规则)。
内容的提问来源于stack exchange,提问作者stefcud
相关产品推荐
相关产品推荐

