GraphQL 能否处理 XML 将单个项目数组转换为字典的响应?

Can GraphQL handle XML responses where single item arrays are converted to dictionaries?

我目前正在使用 GraphQL/Node/Express 服务器从另一个 API 检索数据。除了我收到的数据,我绝对无法访问其他 API。

我的问题是响应是 XML 并且某些字段应作为数组返回,但如果数组中只有一项,则作为对象(或字典)返回。

This blog post 更详细地解释了这个问题。

GraphQL 中是否有一种方法可以设计模式,如果它接收到定义为数组的 属性 的对象,它会将对象放入数组中?

例子

当前行为

<team>
  <employee>
    <name>Joe</name>
    <surname>Bloggs</surname>
  </employee>
  <employee>
    <name>Jane</name>
    <surname>Doe</surname>
  </employee>
</team>

上面的XML会转换成下面的JSON

{
  team:{
    employee:[
      {
        name:'Joe',
        surname:'Bloggs'
      },
      {
        name:'Jane',
        surname:'Doe'
      }
    ]
  }
}

但如果只有一名员工

<team>
  <employee>
    <name>Joe</name>
    <surname>Bloggs</surname>
  </employee>
</team>

上面的XML会转换成下面的JSON,其中employee变成一个对象而不是数组

{
  team:{
    employee:{
      name:'Joe',
      surname:'Bloggs'
    }
  }
}

是的,实现起来很容易

使用 Apollo,您可以定义解析器映射,用于解析您类型的所有字段和子字段,用于查询和变更。

Read about resolvers

在您的情况下,您可以为 Team 类型的特定字段 employee 编写一个解析器,这将确保 return 一个数组。

{ 
  Team: {
   employee(parentObject, args, context) {
     const {employee} = parentObject
         // you should probably handle the case when employee is null or undefined
     return Array.isArray(employee) ? employee : [employee]
   }
  ...
}

结果将是:

{
  team: {
    employee: [
      {
        name:'Joe',
        surname:'Bloggs'
      }
    ]
  }
}

注意:您不必自己实现所有解析器功能。如果您没有为字段提供解析器函数,Apollo 将使用默认解析器。这通常意味着简单地return按原样计算值。