首页 > 解决方案 > 是否可以在 GraphQL 对象类型中定义包含井号字符 (#) 的字段?一般用来写评论

问题描述

语境

使用 Last.fm API 端点将它们转换为 GraphQL 对象类型。API 中 JSON 对象的每个键都将匹配 GraphQL 对象中的相应字段。下面链接中的示例。
GraphQL 对象的 API 端点

问题

API 中的一些 JSON 键以 # 字符开头,在 GraphQL 中用于编写注释。因此,它们不能用作 GraphQL 对象中的字段。如以下链接所示。
问题

澄清的解析器

const songResolvers = {
  Query: {
    async track(_, { mbid }) {
      const response = await axios.get(`${BASE_URL}?method=track.getInfo&api_key=${API_KEY}&mbid=${mbid}&format=json`);
      return response.data.track;
    },
  },
};

解决方案?

我找到了一种解决方法,但是 imo,非常丑陋。基本上,我在返回响应之前重命名键,当然还可以将对象中的字段从“#text”编辑为“text”。

const images = response.data.track.album.image;
images.forEach(async (image) => {
  Object.defineProperty(
    image, 'text',
    Object.getOwnPropertyDescriptor(image, '#text'),
  );
  await delete image['#text'];
});

我怀疑这是要走的路,所以有没有办法将# 字符用作 GraphQL 对象类型中的字段?或者是否有比上述更简洁的解决方案来避免在 GraphQL 对象类型中使用 # 字符?

PS 我关于stackoverflow的第一个问题,所以如果我的结构有什么问题,问了问题等等。请告诉我

标签: javascriptgraphql

解决方案


这里主要有两点:

  1. 不,GraphQL 字段名称中不可能有特殊字符,您仅限于字母数字:http: //facebook.github.io/graphql/June2018/#sec-Names

  2. 我通常认为最好的做法是始终提供从来自下游源(例如 Last.fm api,甚至您自己的内部端点)的数据到表示 GraphQL 中的规范“类型”的对象的映射函数架构。在许多情况下,这可能只是一个识别功能,但在其他情况下(如您的),它可能需要一些实际代码。

我不得不将一些真正令人讨厌的遗留数据源按摩成适合 GraphQL 模式的形状,所以我通常做的是将转换集成到服务调用层中,而不是集成到我的解析器中。包装 API 调用的另一个原因是,您可能有来自不同下游 API 的表示相同模式类型的数据,这些 API 返回不同的数据形状 (urgh)。这是您真的不想在解析器中处理的场景。


推荐阅读