You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:37:08