当前位置: 首页 > 知识库问答 >
问题:

如何在react apollo graphql查询中正确使用动态变量?

龚奕
2023-03-14

我有一个apollo包装的组件,它应该为我的组件提供来自github graphql v4 api的响应数据。我打算使用应用程序另一部分的字符串(SEARCH\u QUERY)来用于我的gql查询,但github不断返回未定义的字符串。我在关注阿波罗官方文件http://dev.apollodata.com/react/queries.html#graphql-选项。我看不出我做错了什么。

import React, { Component } from 'react';
import { Text, FlatList  } from 'react-native';
import { graphql } from 'react-apollo';
import gql from 'graphql-tag';
import { SEARCH_QUERY } from './Home' // this is a string like "react"

// The data prop, which is provided by the wrapper below contains,
// a `loading` key while the query is in flight and posts when ready
const ReposList = ({ data: { loading, search }}) => <Text>SearchResults</Text>

// this doesnt work because I cant properly inject 'SEARCH_QUERY' string
const searchRepos = gql`
  query searchRepos($type: searchType!, $query: String!) {
    search(type: REPOSITORY, query: $query, first: 100) {
      edges {
        node {
          ... on Repository {
            nameWithOwner
            owner {
              login
            }
          }
        }
      }
    }
  }
`
// The `graphql` wrapper executes a GraphQL query and makes the results
// available on the `data` prop of the wrapped component (ReposList here)
export default graphql(searchRepos, {
  options: { variables: { query: SEARCH_QUERY }, notifyOnNetworkStatusChange: true }
  }
)(ReposList);

这个没有变量的查询运行良好,并按预期返回搜索结果。直截了当,对吧?

const searchRepos = gql`{
search(type: REPOSITORY, query: "react", first: 100) {
   edges {
     node {
       ... on Repository {
         nameWithOwner
         owner {
           login
         }
       }
     }
   }
 }

}'

当使用它时,github返回未定义。

const searchRepos = gql`
  query searchRepos($type: searchType!, $query: String!) {
    search(type: REPOSITORY, query: $query, first: 100) {
      edges {
        node {
          ... on Repository {
            nameWithOwner
            owner {
              login
            }
          }
        }
      }
    }
  }
`

共有1个答案

王彭薄
2023-03-14

您的查询出错,因为您定义了一个变量$type,但实际上并没有在查询中使用它。您实际上不必随查询发送任何变量——您可以在查询中定义一个或多个变量,然后再也不必在graphql中定义任何变量。这将是一个有效的请求,由服务器来处理未定义的变量。但是,如果在查询本身中定义任何变量,则必须在该查询中使用该变量,否则将拒绝该查询。

在开发过程中,您可能会发现记录数据很有帮助。错误,以更轻松地识别查询中的问题。当查询格式不正确时,GraphQL引发的错误通常具有很强的描述性。

旁注:您可能不想对变量使用静态值。您可以从传递给HOC正在包装的组件的道具计算变量(以及任何其他选项)。请参见文档中的此部分。

const options = ({someProp}) => ({
  variables: { query: someProp, type: 'REPOSITORY' },
   notifyOnNetworkStatusChange: true,
})
export default graphql(searchRepos, {options})(ReposList)
 类似资料:
  • 问题内容: 我想使用表变量而不是临时表,但是我的主要查询构造是动态的。动态查询用单引号引起来,所以我该如何从@TableVariable中获取数据。我不想删除动态查询,因为稍后会添加一些参数。 例如,以下是错误代码,其中我已将表变量写入动态查询中..... 在这方面帮助我。 提前致谢。 问题答案: 试试这个 :

  • 在PL/SQL中,可以使用连接指定In运算符的值: 是否可以使用变量执行相同的操作? 如果是这样,如何? 编辑:参考Marcin的回答,我如何从结果表中选择? 我得到以下错误:

  • 问题内容: 如何动态传递变量参数 TypeError:必须为str,而不是int 尽管我转换为字符串有任何想法,但遇到了以上错误? 有没有其他的方式来传递参数? 问题答案: 通过通过关键字arguments提供参数来使用参数化sql 。数据库适配器将为您完成参数的正确引用,并且代码将较不容易受到SQL注入攻击。(有关不正确引用的非参数化sql可能引起您的麻烦的类型,请参阅Little Bobby

  • 问题内容: 我有5个表或表要从\查询 我的语法我喜欢这样 问题是,当我运行此命令时,我收到一条错误消息:“ .....您在SQL WHERE Patient_ID =吗?附近有错误?” 当我使用system.out.println(sql2)输出sql时; 值未在sql2中设置 问题答案: 当您准备一条语句时,数据库将构造一个执行计划,如果表不存在,则该计划无法执行。换句话说,Placehodle

  • 问题内容: 我有一个html表,可将mySQL数据库表中的所有内容加载。我有与该mySQL表的列相关的下拉菜单-当用户选择下拉菜单之一时,它将使用AJAX查询数据库。 我需要弄清楚如何动态构建查询,因为有时下拉列表将为空(即,它们不想按该列进行过滤)。 做这个的最好方式是什么? 目前我有这样的事情: 您可以想象这是行不通的,因为如果这些字段中的任何一个为空,查询都会失败(或者不返回任何内容)。 显

  • 问题内容: 我正在使用PDO,并希望执行以下操作: PDO是否允许我这样绑定表名和列名?这 似乎是 允许的,但是却让我周围的报价参数,即使我用PDO :: PARAM_INT或PDO :: PARAM_BOOL作为数据类型。 如果这不起作用,如何安全地对变量进行转义,以便可以在查询中对它们进行插值? 问题答案: 不幸的是,您不能按列名绑定参数。 您可以尝试动态创建SQL命令: 只要确保对参数/变量