是否可以在 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;
},
},
};

解决方案是什么?

我找到了一种解决方法,但恕我直言,非常丑陋。基本上,我在返回响应之前重命名键,当然还会将对象的字段从"#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我的第一个问题是关于堆栈溢出的,所以我的结构是否有任何问题,问了这个问题等。请让我知道

这里有两件主要的事情:

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

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

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

最新更新