什么是“StringQueryOperatorInput”类型?我怎样才能摆脱这个烦人的 graphql 错误?

Ave*_*nds 7 javascript node.js graphql gatsby

我正在尝试使用 Gatsby API createPages 和来自 Firebase 的数据以编程方式创建 Gatsby 页面。我已经成功设置了所有内容,直到可以通过 GraphQL 访问 Firebase 数据,现在我想查询使用 id(字符串格式)创建的每个新页面的特定数据。但是,当我创建模板组件并尝试查询数据时,出现此错误:

Variable "$clientId" of type "String!" used in position expecting type "StringQueryOperatorInput".
Run Code Online (Sandbox Code Playgroud)

我到处寻找这个StringQueryOperatorInput的参考,但找不到任何关于它的信息。谷歌和 graphql 文档似乎没有提到这个词,这是我第一次看到它。经过一个小时的故障排除后,我得到了一个不同的错误:

If you're e.g. filtering for specific nodes make sure that you choose the correct field (that has the same type "String!") or adjust the context variable to the type "StringQueryOperatorInput".
File: src/templates/Homeowner/Homeowner.js:24:9
Run Code Online (Sandbox Code Playgroud)

但是,我仍然不知道 StringQueryOperatorInput 是什么或如何解决这个问题。下面是我的这个组件的代码和我的 gatsby-node.js 和我的 gatsby-config.js,我使用插件来获取 Firebase 数据。我真的可以在这方面使用一些帮助,我似乎找不到这个 StringQueryOperatorInput 的任何参考。其他一切正常,我只是无法在 Homeowner.js 模板上运行此查询。

gatsby-node.js

exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions;
  const result = await graphql(`
    query {
      allClients {
        nodes {
          firstName
          lastName
          id
        }
      }
    }
  `);
  console.log(JSON.stringify(result, null, 4));
  result.data.allClients.nodes.forEach(node => {
    const slug = `/client/${node.id}`;
    createPage({
      path: slug,
      component: require.resolve(`./src/templates/Homeowner/Homeowner.js`),
      context: { clientId: node.id },
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

src/templates/Homeowner/Homeowner.js

import React from 'react';
import { graphql } from 'gatsby';
import { withFirebase } from '../../components/Firebase';
import { withStyles } from '@material-ui/core/styles';
import Layout from '../../components/layout';

const Homeowner = ({ data }) => {
  console.log(data.clients, 'data');
  return (
    <>
      <Layout>
        <h1>Home Owner Component</h1>
        {/* <h3>{client.firstName}</h3>
        <h3>{client.lastName}</h3>
        <h3>{client.email}</h3> */}
      </Layout>
    </>
  );
};

export default Homeowner;

export const query = graphql`
  query($clientId: String!) {
    clients(id: $clientId) {
      firstName
      lastName
      email
    }
  }
`;
Run Code Online (Sandbox Code Playgroud)

gatsby-config.js

require('dotenv').config({
  path: `.env.${process.env.NODE_ENV}`,
});
module.exports = {
  siteMetadata: {
    title: `SiteTitle`,
    siteUrl: `https://www.mysitwe.com`,
    description: `YourSite`,
  },
  plugins: [
    `gatsby-plugin-react-helmet`,
    `gatsby-plugin-sitemap`,
    `gatsby-plugin-styled-components`,
    `gatsby-plugin-sharp`,
    `gatsby-transformer-sharp`,
    {
      resolve: `gatsby-source-firebase`,
      options: {
        credential: require('./firebase-key.json'),
        databaseURL: 'https://firebaseurl/',
        types: [
          {
            type: 'Clients',
            path: 'clients',
          },
          {
            type: 'Users',
            path: 'users',
          },
        ],
      },
    },
    {
      resolve: `gatsby-plugin-prefetch-google-fonts`,
      options: {
        fonts: [
          {
            family: `Nunito Sans`,
            variants: [`400`, `600`, `800`],
          },
          {
            family: `Montserrat`,
            variants: [`300`, `400`, `400i`, `500`, `600`],
          },
          {
            family: `Spectral`,
            variants: [`400`, `600`, `800`],
          },
          {
            family: `Karla`,
            variants: [`400`, `700`],
          },
        ],
      },
    },
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `images`,
        path: `${__dirname}/src/images`,
      },
    },
    `gatsby-plugin-offline`,
  ],
};
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,请提前致谢。

Ave*_*nds 6

其实从字面上我张贴了这个问题之后我找到了解决办法。我需要像这样设置我的查询:

export const query = graphql`
  query($clientId: String!) {
    clients(id: { eq: $clientId }) {
      firstName
      lastName
      email
    }
  }
`;
Run Code Online (Sandbox Code Playgroud)

我假设省略 {eq: $clientId} 会在 GraphQL 端引发 StringQuery 错误。我仍然不知道StringQueryOperatorInput是什么,但是,我已经成功地使用来自 firebase 的数据生成了页面。

  • @Mike'Pomax'Kamermans 同样在这里,很高兴我找到了这篇文章,因为它对我有帮助。我不明白你居高临下的评论。 (4认同)
  • 我不知道它是否值得删除,因为当我最初搜索术语 StringQueryOperatorInput 时,我找不到任何具体的参考或定义。所以我认为最好将其保留,以便其他人可以看到丹尼尔上面的答案。 (3认同)
  • 也很庆幸你没有删除。迈克,有时人们在发布问题之前会搜索几个小时。假设你所说的是不合理的。 (3认同)
  • 是的!不要删除!您可能能够很快找到答案,但这并不意味着其他人也能找到答案。我也遇到了这个问题,如果不是这个答案,我仍然会对为什么我的查询不起作用感到困惑。 (2认同)

Dan*_*den 5

StringQueryOperatorInput是字段参数的类型。GraphQL 包括标量类型(如、或 )以及描述更复杂数据结构(如数组或对象)的类型。在本例中,是输入对象类型——它描述了可用作参数值或变量等输入的对象。idclientsStringIDIntStringQueryOperatorInput

在过滤字段时,Gatsby 使用这样的输入对象来启用使用各种比较运算符来过滤公开的数据 - 除了eq(等于) 之外,您还可以使用其他运算符,例如ne, regex, in,gt等。您可以看到完整的列在这里。因为并非所有输入都适用于所有标量(regex对于字段有意义String,但lte没有),因此每个标量都有不同的输入类型(IntQueryOperatorInputBooleanQueryOperatorInput等)

Gatsby在开发中公开了一个 GraphiQL 端点。使用 GraphiQL 编写查询允许您利用自动完成和语法突出显示,从而避免此类意外语法错误。您还可以使用“文档”按钮来搜索和浏览整个架构。