上下文
使用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的问题,所以我的结构,问题等是否存在问题。请让我知道
答案 0 :(得分:0)
这里有两件事:
否,GraphQL字段名称中不能包含特殊字符,您只能使用字母数字:http://facebook.github.io/graphql/June2018/#sec-Names
我通常认为最佳做法是始终提供从下游源(例如Last.fm api甚至您自己的内部端点)到代表规范的对象的映射功能。 GraphQL模式中的“类型”。在许多情况下,这可能只是一个识别功能,但在其他情况下(如您的情况),可能需要一些实际的代码。
我不得不将一些真正令人讨厌的旧数据源整理成适合GraphQL模式的形状,因此我通常要做的是将转换集成到服务调用层中,而不是集成到我的解析器中。包装API调用的另一个原因是,您可能具有表示相同模式类型的数据,这些数据来自不同的下游API,这些API返回不同的数据形状(urgh)。您真的不想在解析器中处理这种情况。