使用 Cloud Code Functions 進行 GraphQL 和 NodeJS 集成

GraphQL 为应用程序接口开发人员带来了糖、香料和一切美好的东西,但它基本上是一种查询语言,因此您可以指定您正在寻找的东西。

如果您的应用程序需要比这更多的商业智能呢?

如果还需要一些逻辑呢?

如果你还需要整洁的NPM 模块呢?

那么,请系好安全带,因为今天我将向你展示一些非常强大的功能。有了强大的功能,也就有了强大的……嗯……强大的时间节省、强大的可能性、强大的许多好东西

如果你想了解更多关于 GraphQL 的信息,请看这篇文章:什么是 GraphQL

你必须这么高才能骑…

使用 Parse 3.5.0 或更高版本来使用 GraphQL。
前往服务器设置和管理 Parse 服务器,确保用户使用的是兼容版本。

我们全新的闪亮功能GraphQL + 云代码函数

如果你已经是 Parse/Back4app 用户,你可能已经使用过或至少听说过云代码。

云代码本质上是通过 Back4app 应用程序服务器而不是终端设备运行的 NodeJS 代码。

这将根据您的需求带来一些关键优势,但主要是让您可以

  • 节省手机电池

    当您将大量的处理工作从设备转移到云端时,高强度的处理工作将不会在设备上完成,从而节省了电池。您可以在我们的服务器上进行处理,并只向客户检索最终结果。口袋里不再有发烫的手机。再也不用担心 “哎呀,这个应用程序把我的电池都吸干了!”。

  • 节省数据计划

    为了获得报告,您必须检索大量对象。几千个?数百万?
    如果你没有使用 WiFi,最好升级一下手机数据计划。
    我们都知道数据计划是相当昂贵的(现在没有人再为短信付费了,对吧?),那么,如果我们有一个更聪明的方法呢?
    如果我们能在云端获得完全计算好的报告,然后只将最后的结果传送到设备上呢?更小的有效载荷,更少的数据消耗,更快的运行速度?
    听起来很棒吧?这就是云代码的作用…

  • 更快地部署代码

    曾几何时,开发人员必须将自己的软件重新发布到应用商店。那时候,这就像抽签一样:如果审核速度快,你的应用程序就能在当天与用户见面。如果审核速度慢或挑剔,您的应用程序可能需要数周时间才能发布。如果能发布的话。
    为什么要冒这个险?
    只将应用程序的前端部分交付给应用程序商店,并将尽可能多的逻辑作为云代码调用。
    需要对逻辑进行小改动?还是大改动?没问题。
    更改云代码,重新部署,一切如新。不需要来自其他地方的某个人的审查,并能立即为客户提供服务。

但是……GraphQL 又如何呢?

GraphQL 可以让你进行查询。你可以进行非常智能的查询,但仅仅是查询。

当我们的首席执行官达维在讨论如何让 GraphQL 更智能时,与云代码函数的集成似乎就是一种逻辑:你拥有了两个世界中最好的东西!云代码函数的强大和智能,以及 GraphQL 的易用性和可维护性。

通过我们的新功能,您可以扩展 GraphQL 的类型,以执行云代码函数并检索其结果。

您可以在云代码函数中应用任何您能想象到的业务逻辑,将NPM 模块一并纳入其中,并使用 GraphQL 进行查询。

话不多说。让我们开始动手吧……

我们将使用的类和对象

在这篇文章中,我创建了两个不同的类:雇员(Employee)和宠物(Pet),这两个类将包含 Back4app 的雇员和他们各自的宠物。

雇员具有以下属性:

  • 姓名(字符串)
  • 年龄(数字)
  • 电子邮件(字符串)
  • 职位(字符串)
  • hasThisPet (指向宠物类的指针)

screen-shot-2019-08-07-at-13-18-26

宠物具有以下属性:

  • 名称(字符串)
  • 物种(字符串)

screen-shot-2019-08-07-at-13-18-37

以及一些云代码函数

对于我们的云代码函数,我将编写一个名为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")
}

没那么难吧?

请注意,我使用了非常广泛的名称,这些名称与云代码函数名称并不一致,这样您就知道在公开时可以重命名。

现在回到应用程序的云代码功能部分,上传该文件。确保它也在云文件夹中。如果需要,您可以将其拖放到那里。
如果您已经有一个文件名为该文件的文件,但无法上传新文件,您可以右键单击该文件并在上传前将其删除。

部署好一切,我们就可以开始了:

screen-shot-2019-08-07-at-14-52-49

现在,神奇的时刻到了…

进入 GraphQL 控制台。开始键入 “query”(查询),并使用自动完成功能(Windows 上使用 CTRL + 空格键,Mac 上使用 OPTION + 空格键),然后就能看到神奇的效果了:

screen-shot-2019-08-07-at-15-11-36

所有方法都在这里,我们可以逐一查询。让我们逐一尝试:

  • checkGraphQLSupport

    (解析为我们的云代码函数checkGraphQLSupport)
    screen-shot-2019-08-07-at-15-14-49

  • retrieveThisEmployeeByName(name:String)

    (解析至我们的云代码函数retrieveFirstEmployeeByName)
    screen-shot-2019-08-07-at-15-19-18

  • 给我所有员工

    (解析为我们的云代码函数 retrieveAllEmployees)
    screen-shot-2019-08-07-at-15-21-06
    请注意,在上面的示例中,name 和 age 属性被正确检索,但 hasThisPet 中宠物的 name 和 species 属性为空值。
    这是因为在该云代码函数中,我们没有包含(使用 include() 方法)有关宠物的信息。
    自动完成功能会向我们显示各种可能性,但云代码函数中并没有提供用于满足这些信息的数据。
    请参阅下面的gatherEmployeeAndPetByEmployeeNameresolves示例了解如何包含信息。

  • whichEmployeeIsOnwerOfThisPet

    (解析到我们的云代码函数retrieveOnwerOfPetByName)
    screen-shot-2019-08-07-at-15-26-12

  • gatherEmployeeAndPetByEmployeeName 

    (解析至我们的云代码函数retrieveEmployeeByNameWithPet)
    screen-shot-2019-08-07-at-15-28-54

您出色的定义已更新

这才是将业务逻辑引入 GraphQL 的方法。

爱你 3000!

结论

GraphQL 是一种强大而简单的多平台查询语言和运行时,但归根结底,它只是一种查询语言。
通过与云代码功能的全新集成,我们为您带来了两个世界中最好的功能,释放了云代码的力量(包括NPM 模块,宝贝!)。

现在就看你的创造力了!请在下面的评论中告诉我们您的喜好,以及您是如何在自己的项目中使用它的!

什麼是 Cloud Code?

雲端程式碼本質上是 Node.js。它運行在 Back4app 的伺服器上,而不是終端設備。它根據您的需求提供不同的優勢。它可以節省您的電池電量,加快程式碼部署速度,並根據您的需求節省資料流量。

Cloud Code 如何幫助節省手機電池?

由於設備負載減少,它確實有助於節省電池電量。設備一直在處理的負載將轉移到雲端代碼上,設備將比平時更加空閒。因此,它最終將有助於節省電池電量。

Cloud Code 如何協助保存資料?

Cloud Code 本身會擷取您使用 Wi-Fi 或行動資料時的所有資料。它會不斷重新獲取數據,並在雲端計算完整的報告。
它只會將最後一次的結果檢索到設備,從而減少負載和資料使用。


Leave a reply

Your email address will not be published.