所以我的用例看起来很简单,但我正在努力弄清楚如何做到这一点。
从本质上讲,我想开发一个gatsby-plugin
,它修改所有与内容相关的 graphQL 查询以始终插入contentful_id
,以便返回的数据始终包含该字段。这样,我的插件的消费者就不必在所有 grapqhQL 查询中添加contenful_id
字段。
这甚至可行吗?我对创建字段不感兴趣,因为我相信除非您显式添加该字段,否则它们不会成为返回数据的一部分。
方法:
- 使用
graphql
SDK 访问节点。像这样定义访客:
const { print, visit, parse } = require('graphql');
const visitor = {
SelectionSet(node, key, parent) {
if (!isQuery(parent) && !isFragment(parent)) {
node.selections.push({
kind: 'Field',
name: { kind: 'Name', value: 'yourFieldName' },
});
}
},
};
function isQuery(node) {
return node.kind === 'OperationDefinition' && node.operation === 'query';
}
function isFragment(node) {
return node.kind === 'FragmentDefinition';
}
- 然后您访问并将其打印回字符串:
const result = visit(parse(queryAST), { enter: visitor });
return print(result);
- 最后一步是将所需的字段添加到所有节点(否则该字段将不存在,并且篡改的查询将不起作用(。您可以实现此附加到此事件:
exports.setFieldsOnGraphQLNodeType = () => {
return {
yourFieldName: {
type: GraphQLString,
resolve: (source) => {
return source.contentful_id || '';
},
},
};
};