首页 > 解决方案 > 查询参数在 GraphQL 中传播

问题描述

我有以下架构:

input ResumeFilter {
  id: ID
  accountId: ID
  lang: Lang
}

extend type Query {
  resume(filter: ResumeFilter): Resume!
  resumes(filter: ResumeFilter, offset: Int, limit: Int): [Resume!]!
}

现在我想filter从查询中删除关键字,resume因为它不会有除此之外的任何内容:

extend type Query {
  resume(id: ID, accountId: ID, lang: Lang): Resume! # !!! repeats ResumeFilter !!!
  resumes(filter: ResumeFilter, offset: Int, limit: Int): [Resume!]!
}

为了解决 DRY 违规问题,我正在尝试这样的事情:

extend type Query {
  resume(...ResumeFilter): Resume!
  resumes(filter: ResumeFilter, offset: Int, limit: Int): [Resume!]!
}

这在语法上是不正确的。有没有一种语法/方法可以优雅地解决这种情况?也许与片段?

标签: apigraphql

解决方案


片段只能在客户端与可执行文档一起使用。没有用于传播输入对象的语法。如果您的服务器端语言支持字符串插值,则可以使用它。例如,在 JavaScript 中:

const resumeFilterFields = `
  id: ID
  accountId: ID
  lang: Lang
`

const schema = `
  input ResumeFilter {
    ${resumeFilterFields}
  }

  extend type Query {
    resume(${resumeFilterFields}): Resume!
    resumes(filter: ResumeFilter, offset: Int, limit: Int): [Resume!]!
  }
`

推荐阅读