Gatsby:在插件中执行之前,在 graphql 查询中注入一个字段



所以我的用例看起来很简单,但我正在努力弄清楚如何做到这一点。

从本质上讲,我想开发一个gatsby-plugin,它修改所有与内容相关的 graphQL 查询以始终插入contentful_id,以便返回的数据始终包含该字段。这样,我的插件的消费者就不必在所有 grapqhQL 查询中添加contenful_id字段。

这甚至可行吗?我对创建字段不感兴趣,因为我相信除非您显式添加该字段,否则它们不会成为返回数据的一部分。

方法:

  • 使用graphqlSDK 访问节点。像这样定义访客:
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 || '';
},
},
};
};

相关内容

最新更新