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

Posted

技术标签:

【中文标题】什么是“StringQueryOperatorInput”类型?我怎样才能摆脱这个恼人的 graphql 错误?【英文标题】:What is type "StringQueryOperatorInput"? How can I get rid of this annoying graphql error? 【发布时间】:2020-05-23 01:33:18 【问题描述】:

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

Variable "$clientId" of type "String!" used in position expecting type "StringQueryOperatorInput".

我到处寻找此 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

但是,我仍然不知道 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 ,
    );
  );
;

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
    
  
`;

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`,
  ],
;

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

【问题讨论】:

【参考方案1】:

实际上字面意思在我发布这个问题后就找到了解决方案。我需要像这样设置我的查询:

export const query = graphql`
  query($clientId: String!) 
    clients(id:  eq: $clientId ) 
      firstName
      lastName
      email
    
  
`;

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

【讨论】:

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

StringQueryOperatorInputclients 字段的id 参数的类型。 GraphQL 包括标量类型,如 StringIDInt,以及描述更复杂数据结构(如数组或对象)的类型。在这种情况下,StringQueryOperatorInput 是一个输入对象类型——它描述了可以用作参数值或变量等输入的对象。

在过滤字段时,Gatsby 使用这样的输入对象来启用使用各种比较运算符来过滤暴露的数据——除了eq(等于),您还可以使用其他运算符,如ne、@ 987654332@、ingt等。您可以查看完整列表here。因为并非所有输入都适用于所有标量(regexString 字段有意义,但 lte 没有),每个标量都有不同的输入类型(IntQueryOperatorInputBooleanQueryOperatorInput 等)

盖茨比exposes a GraphiQL endpoint in development。使用 GraphiQL 编写查询允许您利用自动完成和语法突出显示,这样您就可以避免像这样的意外语法错误。您还可以使用“文档”按钮来搜索和浏览整个架构。

【讨论】:

这让新用户感到困惑,因为在使用 GraphiQL 和 Gatsby 时,GraphQL 标准查询文档中的第一个示例(适用于自己的架构)会引发此错误。

以上是关于什么是“StringQueryOperatorInput”类型?我怎样才能摆脱这个恼人的 graphql 错误?的主要内容,如果未能解决你的问题,请参考以下文章

时间是什么?时间同步是什么?GPS北斗卫星授时又是什么?

什么是拉电流,什么是灌电流?什么是吸收电流 ?

在java中,OOA是什么?OOD是什么?OOP是什么?

什么是DIV,全称是什么?

什么是抢占/什么是可抢占内核?到底有什么好处呢?

什么是 JNDI?它的基本用途是什么?什么时候使用?