使用云代码功能进行 GraphQL 和 NodeJS 集成
GraphQL 为应用程序接口开发人员带来了糖、香料和一切美好的东西,但它基本上是一种查询语言,因此您可以指定您正在寻找的东西。
如果您的应用程序需要比这更多的商业智能呢?
如果还需要一些逻辑呢?
如果你还需要整洁的NPM 模块呢?
那么,请系好安全带,因为今天我将向你展示一些非常强大的功能。有了强大的功能,也就有了强大的……嗯……强大的时间节省、强大的可能性、强大的许多好东西
如果你想了解更多关于 GraphQL 的信息,请看这篇文章:什么是 GraphQL
Contents
你必须这么高才能骑…
使用 Parse 3.5.0 或更高版本来使用 GraphQL。
前往服务器设置和管理 Parse 服务器,确保用户使用的是兼容版本。
我们全新的闪亮功能GraphQL + 云代码函数
如果你已经是 Parse/Back4app 用户,你可能已经使用过或至少听说过云代码。
云代码本质上是通过 Back4app 应用程序服务器而不是终端设备运行的 NodeJS 代码。
这将根据您的需求带来一些关键优势,但主要是让您可以
-
节省手机电池
当您将大量的处理工作从设备转移到云端时,高强度的处理工作将不会在设备上完成,从而节省了电池。您可以在我们的服务器上进行处理,并只向客户检索最终结果。口袋里不再有发烫的手机。再也不用担心 “哎呀,这个应用程序把我的电池都吸干了!”。
-
节省数据计划
为了得到一份报告,您必须检索大量对象。几千个?数百万?
这就是你必须检索的大量数据,如果你没有使用 WiFi,你最好升级一下手机数据计划。
我们都知道数据计划是相当昂贵的(现在没有人再为短信付费了,对吧?),那么,如果我们有一个更聪明的方法呢?
如果我们能在云端获得完全计算好的报告,然后只将最后的结果传送到设备上呢?更小的有效载荷,更少的数据消耗,更快的运行速度?
听起来很棒吧?这就是云代码的作用…
-
更快地部署代码
曾几何时,开发人员必须将自己的软件重新发布到应用商店。那时候,这就像抽签一样:如果审核速度快,你的应用程序就能在当天与用户见面。如果审核速度慢或挑剔,您的应用程序可能需要数周时间才能发布。如果能发布的话。
为什么要冒这个险?
只将应用程序的前端部分交付给应用程序商店,并将尽可能多的逻辑作为云代码调用。
需要对逻辑进行小改动?还是大改动?没问题。
更改云代码,重新部署,一切如新。不需要来自其他地方的某个人的审查,并能立即为您的客户提供服务。
但是……GraphQL 又如何呢?
GraphQL 可以让你进行查询。你可以进行非常智能的查询,但仅仅是查询。
当我们的首席执行官达维在讨论如何让 GraphQL 更智能时,与云代码函数的集成似乎就是一种逻辑:你拥有了两个世界中最好的东西!云代码函数的强大和智能,以及 GraphQL 的易用性和可维护性。
通过我们的新功能,您可以扩展 GraphQL 的类型,以执行云代码函数并检索其结果。
您可以在云代码函数中应用任何您能想象到的业务逻辑,将NPM 模块一并纳入其中,并使用 GraphQL 进行查询。
话不多说。让我们开始动手吧……
我们将使用的类和对象
在这篇文章中,我创建了两个不同的类:雇员(Employee)和宠物(Pet),这两个类将包含 Back4app 的雇员和他们各自的宠物。
雇员具有以下属性:
- 姓名(字符串)
- 年龄(数字)
- 电子邮件(字符串)
- 职位(字符串)
- hasThisPet (指向宠物类的指针)
宠物具有以下属性:
- 名称(字符串)
- 物种(字符串)
以及一些云代码函数
对于我们的云代码函数,我将编写一个名为main.js的文件,并包含以下代码。
该文件包含五个注释完整的云代码函数,它们将完成以下工作:
- checkGraphQLSupport
检索应用程序是否支持 GraphQL - retrieveFirstEmployeeByName
检索在数据库中找到的具有给定名称的第一个雇员的所有详细信息 - 检索所有雇员
检索所有员工的所有详细信息 - 按姓名检索宠物弃养人
检索拥有给定名称宠物的员工的详细信息 - 按姓名检索有宠物的员工
检索员工及其宠物的所有详细信息
Parse.Cloud.define("checkGraphQLSupport",async req => { /* 此函数返回应用程序是否支持 GraphQL。 当应用程序支持时,parseGraphQLServer 为 true,否则为 false。 */ if (parseGraphQLServer){ 返回 "此应用程序支持 GraphQL"; } else { return "This App does not have GraphQL support.可能是 Parse 版本错误? } }); Parse.Cloud.define("retrieveFirstEmployeeByName", async req => { /* 此函数将检索出第一个具有给定名称的雇员。 将检索雇员的所有属性。 如果数据库中有多个雇员,则只返回一个。 如果没有雇员,则返回空值。 */ const query = new Parse.Query("Employees"); */ const query = new Parse.Query("Employees"); query.equalTo("name", req.params.name); const result = await query.first(); 返回结果; }); Parse.Cloud.define("retrieveAllEmployees",async req => { /* 此函数检索所有雇员。 将检索雇员类的所有属性,但仅限于该类。 不检索指针或关系的详细信息,只检索对象 ID。 返回雇员数组。如果没有雇员,则返回空数组。 */ const query = new Parse.Query("Employees"); const results = await query.find(); 返回结果; }); Parse.Cloud.define("retrieveOnwerOfPetByName",async req => { /* 此函数检索与宠物相关的雇员信息、 的雇员信息。 将检索雇员类的所有属性。 不会检索宠物的详细信息。 返回一个宠物数组。如果未找到宠物,则返回空数组。 */ // 首先,我们进行查询以获取宠物信息 const petQuery = new Parse.Query("Pet"); petQuery.equalTo("name", req.params.name); // 然后,我们根据 hasThisPet 属性进行查询,以获取宠物主人的详细信息 let employeeQuery = new Parse.Query("Employees"); employeeQuery.matchesQuery("hasThisPet", petQuery); const results = await employeeQuery.find(); 返回结果; }); Parse.Cloud.define("retrieveEmployeeByNameWithPet",async req => { /* 此函数检索雇员及其相关宠物的信息、 的信息。 雇员类和宠物类的所有属性都将被检索。 将返回一个雇员数组,其中包括一个填充完整的 hasThisPet 属性,该属性包含宠物的相关信息。 属性。 如果没有找到 Employee,则返回一个空数组。 */ const query = new Parse.Query("Employees"); query.equalTo("name",req.params.name); query.include("hasThisPet") const results = await query.find(); 返回结果; });
我们将把它上传到云代码功能中的 Cloud 文件夹。
额外的小步骤
我们刚刚发布的云代码函数现在可以使用了,但为了让它们与 GraphQL 配合使用,我们必须创建一个名为schema.graphql的文件,并公开这些函数。
语法非常简单,但需要注意:
扩展类型查询 { GraphQLMethodName(parameterName: parameterType): ReturnType!@resolve(to:"CloudCodeFunctionName") }
对于上面的代码,语法表示
- GraphQLMethodName
这是您将在 GraphQL 查询中调用的名称。它不必与云代码函数名称相匹配,但您应该选择一个能让人容易理解该方法作用的名称。
- 参数名称
云代码函数内部请求中使用的参数名称。如果不在云代码函数中使用参数,则不必传递此名称。
- 参数类型
您要传递的参数类型。您可以了解有关模式的更多信息,并查看所有可能性。如果您的云代码函数未使用参数,则不必传递此参数。
- 返回类型
这是您的方法的返回类型。
- 云代码函数名称
必须与您在 main.js 文件中给出的云代码函数名称一致,因为它将根据函数名称调用该代码。
因此,对于我们刚刚创建的 main.js 文件,我们的 schema.graphql 将是:
extend type Query { checkGraphQLSupport:字符串!@resolve(to: "checkGraphQLSupport") retrieveThisEmployeeByName (name:String):EmployeesClass!@resolve(to: "retrieveFirstEmployeeByName") giveMeAllEmployees:[EmployeesClass!]@resolve(to: "retrieveAllEmployees") whichEmployeeIsOnwerOfThisPet (name:String):[EmployeesClass!]@resolve(to: "retrieveOnwerOfPetByName") gatherEmployeeAndPetByEmployeeName (name:String):[EmployeesClass!]@resolve(to: "retrieveEmployeeByNameWithPet") }
没那么难吧?
请注意,我使用了非常广泛的名称,这些名称与云代码函数名称并不一致,这样您就知道在公开时可以重命名。
现在回到应用程序的云代码功能部分,上传该文件。确保它也在云文件夹中。如果需要,您可以将其拖放到那里。
如果您已经有一个文件名相同的文件,但无法上传新文件,您可以右键单击该文件并在上传前将其删除。
部署好一切,我们就可以开始了:
现在,神奇的时刻到了…
进入 GraphQL 控制台。开始键入 “query”(查询),并使用自动完成功能(Windows 上使用 CTRL + 空格键,Mac 上使用 OPTION + 空格键),然后就能看到神奇的效果了:
所有方法都在这里,我们可以逐一查询。让我们逐一尝试:
-
checkGraphQLSupport
(解析为我们的云代码函数checkGraphQLSupport)
-
retrieveThisEmployeeByName(name:String)
(解析至我们的云代码函数retrieveFirstEmployeeByName)
-
给我所有员工
(解析为我们的云代码函数 retrieveAllEmployees)
请注意,在上面的示例中,name 和 age 属性被正确检索,但 hasThisPet 中宠物的 name 和 species 属性为空值。
这是因为在该云代码函数中,我们没有包含(使用 include() 方法)有关宠物的信息。
自动完成功能会向我们显示各种可能性,但云代码函数中并没有提供用于满足这些信息的数据。
请参阅下面的gatherEmployeeAndPetByEmployeeNameresolves示例了解如何包含信息。
-
whichEmployeeIsOnwerOfThisPet
(解析到我们的云代码函数retrieveOnwerOfPetByName)
-
gatherEmployeeAndPetByEmployeeName
(解析至我们的云代码函数retrieveEmployeeByNameWithPet)
您出色的定义已更新
这才是将业务逻辑引入 GraphQL 的方法。
爱你 3000!
结论
GraphQL 是一种强大而简单的多平台查询语言和运行时,但归根结底,它只是一种查询语言。
通过与云代码功能的全新集成,我们为您带来了两个世界中最好的功能,释放了云代码的力量(包括NPM 模块,宝贝!)。
现在就看你的创造力了!请在下面的评论中告诉我们您的喜好,以及您是如何在自己的项目中使用它的!
什么是 Cloud Code?
云代码本质上是 Node.js。它运行在 Back4app 的服务器上,而不是终端设备上。它根据您的需求提供不同的优势。它可以节省您的电池电量,加快代码部署速度,并根据您的需求节省数据流量。
Cloud Code 如何帮助节省手机电池?
由于设备负载减少,它确实有助于节省电池电量。设备一直在处理的负载将转移到云代码上,设备将比平时更加空闲。因此,它最终将有助于节省电池电量。
Cloud Code 如何帮助保存数据?
Cloud Code 本身会检索您使用 Wi-Fi 或移动数据时的所有数据。它会不断重新获取数据,并在云端计算完整的报告。
它只会将最后一次的结果检索到设备,从而减少负载和数据使用。