是否可以在GraphQL对象类型中定义包含井号字符(#)的字段?通常用来写评论

时间:2018-06-21 07:52:31

标签: javascript graphql

上下文

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

问题

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

解析器以进行澄清

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的问题,所以我的结构,问题等是否存在问题。请让我知道

1 个答案:

答案 0 :(得分:0)

这里有两件事:

  1. 否,GraphQL字段名称中不能包含特殊字符,您只能使用字母数字:http://facebook.github.io/graphql/June2018/#sec-Names

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

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