【问题标题】:How can I reshape a GraphQL response?如何重塑 GraphQL 响应?
【发布时间】:2020-12-08 01:16:12
【问题描述】:

我有一个如下所示的 GraphQL 查询:

type Query {
    getProfile(userId: ID!): UserProfile
}

type UserProfile {
    userId: ID!
    name: String!
    email: String!
    street: String!
    city: String
    country: String!
    postal: String!
}

但是,我似乎仅限于使用这样的别名修改来自查询的响应:

query {
    getProfile(userId: "12345") {
        userId
        name
        email
        streetName: street
        city
        country
        postalCode: postal
    }
}

我想重塑响应,这样我就不必通过数据映射器为我的对象放置响应。例如,我可能想要重塑响应,使其看起来像这样:

{
    userId: 12345,
    name: "John",
    email: "john@smith.com",
    address: {
        streetName: "my street name",
        city: "WA",
        country: "US",
        postalCode: "54321"
    }
}

在这种情况下,我在响应中添加了额外的address 级别。我必须在 GraphQL 服务器上专门为这个形状声明一个 type 吗?如果我无权执行此操作,比如说它是第三方 GraphQL API,该怎么办?

感觉我仍然面临着在使用常规 REST API 时必须在 UI 中重新映射响应的问题。在我的情况下,仅使用别名更改字段名称通常是不够的。

如何构建我的 GraphQL 查询以重塑响应以返回不同的形状?

【问题讨论】:

  • 我认为 graphql 规范没有结构映射/结构别名之类的东西。你得到它之后必须在 JS 领域对其进行重组,这无论如何都是司空见惯的,比如将结果按 ID 存储在规范化存储中,每个模型分为不同的存储
  • @AndyRay 啊……我明白了。真可惜。我仍然希望 GraphQL 可以消除我对 UI 中数据映射器的需求。 ://
  • 恕我直言,在阿波罗中使用链接是可能的...... f.e. rest-link 具有输入补丁或转换请求/响应的工具

标签: node.js graphql


【解决方案1】:

我认为您可以将架构改进为:

type UserProfile {
    userId: ID!
    name: String!
    email: String!
    address: Address
}

type Address {
    street: String!
    city: String
    country: String!
    postal: String!
}

然后,您可以为用户数据设置不同的解析器,如果您愿意,还可以使用地址信息

【讨论】:

  • 问题只是关于自定义响应客户端
猜你喜欢
  • 2020-01-12
  • 2016-12-18
  • 2021-04-10
  • 1970-01-01
  • 2020-10-09
  • 2020-12-03
  • 2020-08-06
  • 2019-06-12
  • 2021-02-17
相关资源
最近更新 更多