这是一个免费的博客文章,视频来自ShopifyDevs YouTube频道。在本文中,Shopify Plus的发布工程师Chuck Kosman将带您了解GraphQL的一些关键特性,这些特性对于大规模构建应用程序非常方便。这是由五部分组成的系列教程中的第一部分,该系列教程旨在教育和提高您对GraphQL优点的认识。
在本教程中,Chuck将探索GraphQL操作名称和变量。
注意:本文中的所有图像都超链接到YouTube视频的相关时间戳,因此您可以单击它们以获取更多信息。
使用GraphQL创建一个基本查询
这里我使用的是图形化IDE。这是一个应用程序安装在一个开发商店,我有一些产品,客户和订单填充。如果这些听起来像行话,看看我们的开始使用GrapOB欧宝娱乐APPhQL在Shopify开发人员系列中的文章开始设置。OB欧宝娱乐APP
这是一个非常简单的产品查询。我所做的就是按其检索产品ID
,我提供那个GraphQLID
到ID
论点。这样就行了,我按一下玩这里,我应该把这些数据拿回来。
虽然它是可行的,但还不能大规模使用。你必须把这个查询传递进去,当我做一个HTTP
请求。这意味着如果你想改变ID
S,你每次都要用字符串插值来组合查询。
虽然这是可以的,但它不是理想的,而且它也没有真正利用GraphQL的类型系统。
在GraphQL中定义名称
我们可以在查询主体的开头添加一些东西,以使其更具可重用性。这些都是操作名和变量。请记住,这是一个隐式查询,因为我省略了query关键字。不过,我需要为下一个操作提供query关键字。
你可能还喜欢:开始使用GrapOB欧宝娱乐APPhQL。
我可以通过在查询关键字后输入操作名称来为操作命名。对于突变我也可以这样做。如果这里说突变
然后我有一个空间,我可以这样做。约定是PascalCase,描述返回的是什么。
我要说ProductTitleAndDescription
。当我再次运行此程序时,您将看到实际上没有任何变化,但是我们可以自由地添加操作名称。
用GraphQL定义变量
下一部分是变量。变量的语法是这样的:
我要在操作名后面开括号,假设我要提供一个变量ID
。的$
符号表示这是一个变量。我要用a:
然后我要说这个变量的类型是ID
。变量的重要性在于,您实际上必须指定类型。
我们将稍微改变一下这个查询。我要把这个复制到我的剪贴板上,我会说ID
我提供给这个产品领域的是ID
变量。
现在,我还没有提供一个变量。当我点击播放时,它会说,嘿,我们期待你提供类型ID
这个ID
变量。你没有提供一个有效值,实际上你什么都没提供。
这就是查询变量窗格在以下情况下使用的地方HTTP
客户端或图形化应用程序,实际提供变量的语法是这样的:
我将打开一组花括号,然后我要说ID
值,注意这里,它实际上选择了,我试图提供anID
类型变量ID
根据我设置查询的方式,它已经知道了。
我要复制粘贴一下ID
我之前抓过的,我来查一下IDE在后台所做的是将值替换为ID
变量,而不必自己做任何字符串插值。
" IDE在后台所做的是将值替换到ID
变量,而无需自己做任何字符串插值。”
GraphQL语言的实际特性允许我这样做。这并不能很好地描述,因为我们在IDE中工作,但我们可以在一个非常简单的客户端应用程序中看到它是什么样子。
我们将翻到Visual Studio Code看看这些在多大程度上会派上用场。
为Shopify商家构建应用程序
无论您是想为Shopify App Store构建应用程序,提供定制应用程序开发服务,还是正在寻找增加用户基础的方法,Shopify合作伙伴计划都将为您的成功奠定基础。免费加入并访问教育资源、开发人员预览环境和经常性收入分享机会。
报名在应用程序中使用名称和变量
在Visual Studio Code中,我使用客户端库构建了一个非常简单的应用程序graphql-request
。这是使用node发出GraphQL请求的一种非常轻量级的方式。从本质上讲,这几行代码只是为了让这个应用程序在节点环境(而不是浏览器环境)中协作。
注意,我也使用dotenv
这样当我真正发出这个请求时,我就不会在屏幕上把我的私人应用密码暴露给你了,亲爱的读者。我所做的就是对发出请求的端点进行硬编码。
https://getting-OB欧宝娱乐APPstarter-with-graphql.myshopify.com/admin/api/2020-20/graphql.json
恰好是我正在使用的测试存储的地址。我是实例化graphQLClient
并提供必要的头文件,即application / JSON
然后是属于我私人应用程序的实际密码,process.env.API_PASSWORD
。
当您使用GraphQL和应用程序时,您经常会看到以这种方式定义的查询,其中您正在使用的客户端通常具有标记的模板文字函数,其中您传递的字符串是您的请求,无论它是查询还是突变。
您将看到我正在使用变量语法。我说我要提供anID
类型的ID
然后我将把它提供给论证ID
。有许多不同的用法ID
,但它们都有各自独特的用途。
接下来,我要做的是定义我要传入的变量。就像在graphhiql的查询变量窗格中一样,我指定了一个key对象ID
然后对应于乘积的实际字符串ID
。我根据GraphQL请求包中定义的方法发出请求,并提供查询和定义的变量。
我不需要自己做字符串插值,我只需要控制台记录结果。我将运行这个脚本,然后得到我期望的数据。
现在,变量就派上用场了。
我还有其他变量要找,在这里我发行了不同的产品ID
。我将以完全相同的方式发出请求。我要说发出相同的查询,但是提供otherVariables
我已经定义过了。不是这个乘积,而是这个乘积,然后是console log。我也要运行一下。
现在两者都得到了。
这就是变量的重要性。我不需要自己做任何字符串插值,GraphQL已经内置了。现在,这个查询是未命名的。它没有使用任何操作名。如果我把这个注释掉,假设我要发出一个请求。假设我引入了一个语法错误,我忘记了一个大括号。如果我再次运行这个脚本,在我保存它之后,它会对我大喊,“嘿,你做得不对。”
这就是变量的重要性。我不需要自己做任何字符串插值,这已经内置在GraphQL中。”
有趣的是,我直接看到的是查询本身,而没有命名这个操作,这对我来说真的很难完成。
这是一个非常简单的应用,它只发出一个请求。您可以想象,在规模上,您希望查看请求是否失败。你会想知道它是哪个请求。我不想遍历整个应用程序并找出这个结构的查询在哪里。我希望我的日志能够根据一个操作名称计算出来。
你可能还喜欢:Shopify GraphQL学习工具包。
GraphQL操作:为大规模调试命名
我可以任意地引入一个操作名。假设ProductIdAndTitle
因为这是我在这个查询中得到的信息。在不修复语法错误的情况下,我将清除并再次运行它。
现在,当它失败时,至少我在日志中有操作名称。这就是操作名称的重要性所在。这实际上有点类似于匿名函数和命名函数之间的区别。
在匿名函数中,它们是没有名称的函数,因此在堆栈跟踪中很难确定错误发生的位置。这就是为什么要给函数命名的建议;在堆栈跟踪中,它表示这个名称的函数失败。这与这里的原则完全相同,因为您不必命名查询或突变,但这对于大规模调试非常有用。
请继续关注本教程的第2部分,在第2部分中,我们将介绍大规模工作的另一个特性:别名。