首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gatsby:在插件中执行之前,在graphql查询中插入一个字段

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

Stack Overflow用户
提问于 2020-05-23 00:44:46
回答 1查看 91关注 0票数 1

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-05-26 02:15:10

这样做的方法是:

  • 使用graphql SDK访问节点。这样定义一个访问者:

代码语言:javascript
复制
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';
}

然后访问

  • 并将其打印回一个字符串:

代码语言:javascript
复制
  const result = visit(parse(queryAST), { enter: visitor });

  return print(result);

  • 最后一步是将所需的字段添加到所有节点(否则该字段将不存在,并且被篡改的查询将不起作用)。您可以通过附加到此事件来实现此目的:

代码语言:javascript
复制
exports.setFieldsOnGraphQLNodeType = () => {
  return {
    yourFieldName: {
      type: GraphQLString,
      resolve: (source) => {
        return source.contentful_id || '';
      },
    },
  };
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61959904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档