Cloud Code Functionsを使用したGraphQLとNodeJSの統合

GraphQLはAPI開発者に砂糖、スパイス、その他あらゆる素晴らしいものをもたらすが、基本的にはクエリー言語であり、あなたが探しているものを指定することができる。

アプリケーションにそれ以上のビジネスインテリジェンスが必要だとしたら?

それに加えてロジックが必要だとしたら?

NPMモジュールが必要だとしたら?

さて、今日はとてもパワフルなものをお見せしましょう。そして大きな力には、大きな…そう…大きな時間の節約、大きな可能性、大きなたくさんの良いものがついてくる…。

GraphQLについてもっと知りたい方は、こちらの記事をご覧ください:GraphQLとは

この身長でないと乗れない…

また、Parse 3.5.0以上を使用してGraphQLで遊んでください。
サーバーの設定とParseサーバーの管理から、互換性のあるバージョンを使用していることを確認してください。

の新機能GraphQL + クラウド・コード・ファンクション

Parse/Back4appのユーザーであれば、Cloud Codeを使ったことがあるか、聞いたことがあると思います。

Cloud Codeは、基本的にエンドデバイスの代わりにBack4appのアプリケーションサーバーから実行されるNodeJSコードです。

ニーズに応じていくつかの利点がありますが、基本的には以下のことが可能です:

  • 携帯電話のバッテリーを節約

    重い処理をデバイスからクラウドに移すと、激しい処理はデバイス上で行われなくなり、バッテリーを節約できます。処理は当社のサーバーで行い、最終結果のみをクライアントに送信します。ポケットの中の熱い携帯電話はもういらない。もう「このアプリはバッテリーを吸い取る!」なんてことはありません。

  • データプランの節約

    レポートを作成するために、大量のオブジェクトを取得する必要があります。数千?数百万?
    もしWiFiを利用していないなら、携帯電話のデータプランをアップグレードした方がいい。
    データプランがかなり高価であることは誰もが知っている(SMSメッセージにお金を払う人はもういないよね)。
    クラウド上で完全に計算されたレポートを取得し、最後の結果だけをデバイスに取り出せるとしたらどうだろう?ペイロードが小さくなり、データプランの消費量が大幅に減り、実行速度も速くなるとしたら?
    すごいでしょ?それがCloud Codeです。

  • より迅速なコードのデプロイ

    昔々、開発者はApp Storeにソフトウェアを再パブリッシュしなければなりませんでした。当時は抽選でした。早いレビュアーに当たれば、アプリはその日のうちにユーザーに提供されました。レビュアーが遅かったり、うるさかったりすると、アプリが公開されるまでに数週間かかることもあった。公開されたとしてもだ。
    なぜそんなリスクを冒すのか?
    アプリケーションのフロントエンド部分のみをApp Storeに配信し、できるだけ多くのロジックをクラウド・コードとして呼び出せるようにします。
    ロジックにちょっとした変更が必要ですか?あるいは大きな変更が必要ですか?問題ありません。
    クラウド・コードを変更し、再度デプロイすれば、新品同様です。どこかの誰かにレビューされることもなく、すぐにクライアントに提供できます。

しかしまた…GraphQLはどうだろう?

GraphQLではクエリを作成できる。非常にスマートなクエリーを作ることができますが、単なるクエリーです。

私たちのCEOであるDaviがそれをよりスマートにする方法について議論していたとき、Cloud Code Functionsとの統合はまさに論理であるように見えた!Cloud Code Functionsのパワーとインテリジェンス、そしてGraphQLの使いやすさと保守性。

私たちの新機能を通して、Cloud Code Functionsを実行し、その結果を取得するためにGraphQLのタイプを拡張することができます。

Cloud Code Functionsに想像しうるあらゆるビジネスロジックを適用し、NPMモジュールと一緒にインクルードし、GraphQLでクエリすることができます。

話はもう十分だ。さっそく使ってみよう。

使用するクラスとオブジェクト

この投稿では、2つの異なるクラスを作成した:EmployeeとPetで、Back4appの従業員とそれぞれのペットを保持します。

Employeeには以下のプロパティがあります:

  • name (文字列)
  • 年齢 (数値)
  • email (文字列)
  • position (文字列)
  • hasThisPet (ペットクラスへのポインタ)

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

ペットは以下のプロパティを持ちます:

  • name (String)
  • species (文字列)

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

Cloud Code関数

Cloud Code関数については、main.jsという名前のファイルを書いて、次のコードをインクルードします。

完全にコメントされた5つのCloud Code Functionsがあります:

  • チェックGraphQLSupport
    アプリがGraphQLをサポートしているかどうかを取得する。
  • retrieveFirstEmployeeByName(名前による最初の従業員の取得
    データベースで最初に見つかった従業員のすべての詳細を、指定された名前で取得します。
  • retrieveAllEmployees(全従業員
    すべての従業員に関するすべての詳細を取得
  • retrieveOnwerOfPetByName(名前順)
    指定された名前のペットを飼っている従業員の詳細を取得します。
  • retrieveEmployeeByNameWithPet(ペット名で従業員を検索)
    従業員とそのペットのすべての詳細を取得する
Parse.Cloud.define("checkGraphQLSupport", "非同期req => {")
  /*
    この関数は、アプリがGraphQLをサポートしているかどうかを返します。 
    アプリがサポートしている場合、parseGraphQLServerはtrueになり、そうでない場合はfalseになります。
  */
  if (parseGraphQLServer){
    このAppはGraphQLをサポートしています;
  } else {
    return "このAppはGraphQLをサポートしていません。Parse のバージョンが間違っているのでしょうか?
  }
});

Parse.Cloud.define("retrieveFirstEmployeeByName",非同期req => {)
  /*
    この関数は、指定された名前で最初に見つかった Employee を取得します。
    Employee のすべてのプロパティが取得されます。
    データベースに複数の Employee が存在する場合は、1 つだけが返されます。
    Employee が存在しない場合は null を取得します。
  */
  const query = new Parse.Query("Employees"); 
  query.equalTo("name", req.params.name);
  const result = await query.first();
  結果を返します;
});

Parse.Cloud.define("retrieveAllEmployees",非同期 req => {)
  /*
    この関数はすべての Employee を取得します。
    Employee クラスのすべてのプロパティが取得されますが、取得されるのはそのクラスのみです。
    ポインタやリレーションの詳細は取得されず、objectIdのみが取得されます。
    Employee の配列が返されます。Employeesがない場合は空です。
  */
  const query = new Parse.Query("Employees"); 
  const results = await query.find();
  結果を返します;
});

Parse.Cloud.define("retrieveOnwerOfPetByName", async req => {.
  /*
    この関数は、ペットに関連する従業員の情報を取得します、
    の情報を取得します。
    Employee クラスのすべてのプロパティが取得されます。
    ペットの詳細は取得されません。
    Pet の配列が返されます。Pet が見つからない場合は空です。
  */

  // まず、ペットの情報を取得するためのクエリを作成します。
  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 => {.
  /*
    この関数は Employee と関連する Pet の情報を取得します、
    に関する情報を取得します。
    Employee クラスと Pet クラスのすべてのプロパティが取得されます。
    Employee の配列が返されます。
    プロパティを含む Employee の配列が返されます。
    Employee が見つからない場合は、empy 配列が返されます。
  */
  const query = new Parse.Query("Employees"); 
  query.equalTo("name", req.params.name);
  query.include("hasThisPet")
  const results = await query.find();
  結果を返します;
});

これを Cloud Code Functions の Cloud フォルダにアップロードします。

ちょっとした追加手順

先ほど公開したCloud Code Functionsを使用できるようになりましたが、GraphQLで動作させるには、schema.graphqlという名前のファイルを作成し、これらの関数を公開する必要があります。

構文は非常にシンプルですが、注意が必要です:

拡張タイプ Query {
 GraphQLMethodName(parameterName: parameterType)ReturnType!resolve(to:"CloudCodeFunctionName"))。
}

上記のコードの場合、構文は次のようになります:

  • GraphQLMethodName
    これは GraphQL クエリで呼び出す名前です。クラウド コード関数名と一致する必要はありませんが、そのメソッドが何を行うか理解しやすい名前を選択する必要があります。
  • パラメータ名
    Cloud Code Function 内で Request に消費するパラメータの名前。Cloud Code Functionでパラメータを使用しない場合は渡す必要はありません。
  • parameterType
    渡すパラメータの型。スキーマについてもっと学び、すべての可能性を見ることができます。Cloud Code Function でパラメータを使用しない場合は、これを渡す必要はありません。
  • ReturnType
    メソッドの戻り値の型です。
  • CloudCodeFunctionName
    これは、main.js ファイルで指定した Cloud Code Function 名と一致する必要があります。

つまり、先ほど作成した main.js ファイルの場合、schema.graphql は次のようになります:

拡張タイプ クエリー {
  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")。
}

それほど難しくはないだろう?

私はCloud Code Functionsの名前と一致しない非常に広範な名前を使用していることに注意してください。

アプリのCloud Code Functionsセクションに戻って、そのファイルもアップロードしてください。このファイルも Cloud フォルダにあることを確認してください。必要であれば、そこにドラッグ&ドロップできます。
その名前のファイルがすでにあり、新しいファイルをアップロードできない場合は、アップロードする前に右クリックして削除できます。

すべてをデプロイすれば準備完了だ:

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

  • giveMeAllEmployees

    (クラウド・コード関数retrieveAllEmployeesに解決されます)
    screen-shot-2019-08-07-at-15-21-06
    上記の例では、名前と年齢のプロパティは正しく取得されましたが、hasThisPet にはペットの名前と種の null 値があることに注意してください。
    これは、そのクラウド コード関数で、ペットに関する情報を(include()メソッドを使用して)インクルードしていないことが原因です。
    オートコンプリートは可能性を表示しますが、その情報を満たすためのデータはクラウド コード関数に提供されませんでした。
    情報を含める方法については、以下のgatherEmployeeAndPetByEmployeeNameresolvesの例を参照してください。

  • どの従業員がこのペットの世話をするか

    (私たちのクラウド・コード関数retrieveOnwerOfPetByNameに解決します)
    screen-shot-2019-08-07-at-15-26-12

  • gatherEmployeeAndPetByEmployeeName 

    (当社のクラウド・コード関数retrieveEmployeeByNameWithPetに解決されます)
    screen-shot-2019-08-07-at-15-28-54

素晴らしい定義が更新されました

これで、GraphQLにビジネスロジックを導入することができます。

3000を愛しています!

結論

GraphQLは強力で簡単なマルチプラットフォームのクエリ言語でありランタイムですが、結局のところクエリ言語でしかありません。
この全く新しいCloud Code Functionsとの統合により、私たちはCloud Code(NPMモジュールを含む!)のパワーを解き放ち、両方の世界の最高のものをもたらしました。

あとはあなたとあなたの創造性次第です!どのように気に入ったか、プロジェクトでどのように使っているか、下のコメントでお知らせください!

Cloud Codeとは何ですか?

クラウドコードは基本的にNode.jsです。エンドデバイスではなく、Back4appのサーバーから実行されます。ニーズに応じて様々なメリットがあります。バッテリー消費を節約し、コードのデプロイを高速化し、必要に応じてデータを節約できます。

Cloud Code は携帯電話のバッテリー節約にどのように役立ちますか?

デバイスへの負荷が軽減されるため、バッテリーの節約にも役立ちます。デバイスが常に処理していた処理負荷がクラウドコードに移行し、デバイスは通常よりも休止状態になります。そのため、最終的にはバッテリーの節約にも役立ちます。

Cloud Code はどのようにデータの保存に役立ちますか?

クラウドコード自体は、Wi-Fiまたはモバイルデータで取得したすべてのデータを取得します。データを再導出し、クラウド上で完全なレポートを計算し続けます。デバイスには最後の結果のみが取得されるため、ペイロードが小さくなり、データ使用量も削減されます。


Leave a reply

Your email address will not be published.