第10章:DialogFlowを使用してGoogle Homeアプリを構築する方法| Cloud Datastoreを介したフルフィルメント

この章では、Googleクラウドのデータストアを接続して、さまざまなカテゴリの一連の引用符を作成し、ユーザー入力に基づいて引用する方法を説明します。

シリーズコンテンツ:

第6章:Google Home Appチュートリアル:概要

第7章:Google Home Appチュートリアル:会話デザイン

第8章:Google Home Appチュートリアル:環境設定

第9章:Google Home Appチュートリアル:インラインエディターによるフルフィルメント

第10章:Google Home Appチュートリアル:Cloud Datastoreを介したフルフィルメント

第11章:Google Home Appチュートリアル:Webhookを介したフルフィルメント

第12章:Google Homeアプリチュートリアル:アプリの展開

要約と、現在取り組んでいる全体像のどの部分:

まず、データストアとは何か、どのように違うのかを理解しましょう。

Google Cloud Datastoreとは何ですか?

Google Cloud Datastoreは、自動スケーリング、高性能、アプリケーション開発の容易さのために構築されたNoSQLドキュメントデータベースです。

NoSQLデータベースとは何ですか?

NoSQL(元々は「非SQL」または「非リレーショナル」と呼ばれていました)データベースは、リレーショナルデータベースで使用される表形式の関係以外の手段でモデル化されたデータの保存および取得のためのメカニズムを提供します。

従来のデータベースとの比較

Cloud Datastoreインターフェースには、従来のデータベースと同じ機能が多数ありますが、NoSQLデータベースとしては、データオブジェクト間の関係を記述する方法が異なります。 Cloud Datastoreとリレーショナルデータベースの概念の高レベルの比較は次のとおりです。

リレーショナルデータベーステーブルの行とは異なり、同じ種類のCloud Datastoreエンティティは異なるプロパティを持つことができ、異なるエンティティは同じ名前で異なるタイプのプロパティを持つことができます。これらの独自の特性は、自動的にスケーリングする機能を活用するためのデータの設計と管理の異なる方法を意味します。

理論で十分です、始めましょう。

今すぐデータストアをセットアップしましょう

ステップ1:Googleクラウドコンソールにログインします。

ステップ2:プロジェクトを選択し、[データストア]をクリックします。

ステップ3:エンティティを作成する

エンティティは単なるアイテム(行)であることに注意してください。 Kind(QuoteTable)はテーブル名です。名前空間はデフォルトのままにします。

Quote、QuoteID、QuoteTypeはプロパティ[列]です。これらのプロパティを使用してユーザー入力に基づくフィルタリングを行うため、QuoteTypeとQuoteIdにインデックスが付けられていることを確認してください。

次の章で基本的なデータストアが設定されたので、クラウド機能からこれからデータを取得する方法を見ていきます。

インラインエディターに戻りましょう。

これまではindex.jsファイルのみを編集しましたが、このクラウドデータストアはpackage.jsonファイルに追加する必要がある依存関係です。

「@ google-cloud / datastore」:「1.1.0」

index.jsファイルに戻ります。

コードをできるだけシンプルにするつもりです。コーディング標準を期待しないでください:)

  1. オブジェクトをインスタンス化する
const Datastore = require( '@ google-cloud / datastore');
//データストアクライアントをインスタンス化します
const datastore = Datastore();

2.クエリを定義する

const query1 = datastore.createQuery( 'QuoteTable')。filter( 'QuoteType'、 '='、 'Motivational');
const query2 = datastore.createQuery( 'QuoteTable')。filter( 'QuoteType'、 '='、 'Friendship');
const query3 = datastore.createQuery( 'QuoteTable')。filter( 'QuoteType'、 '='、 "Romantic");

3.クエリを実行し、返されたJSONファイルをキャプチャして、特定の見積もりを出力します。

app.intent(LOOKING_FOR_QUOTE_INTENT、(conv)=> {
     const quote_type = conv.parameters [QUOTE_TYPE_ENTITY] .toLowerCase();
     if(quote_type == "motivational"){
         return datastore.runQuery(query1).then(results => {
            conv.ask(results [0] [1] .Quote);
        });
     } else if(quote_type == "friendship"){
        return datastore.runQuery(query2).then(results => {
            conv.ask(results [0] [1] .Quote);
        });
     } else if(quote_type == "romantic"){
     return datastore.runQuery(query3).then(results => {
            conv.ask(results [0] [0] .Quote);
        });
     } else {
         conv.ask( "私に話すのではなく、お尻を下ろして仕事");
     }
});

これを1つ取り上げて理解しましょう。

if(quote_type == "friendship"){
        return datastore.runQuery(query2).then(results => {
            conv.ask(results [0] [1] .Quote);
        });

結果は、2つの部分を持つJSONオブジェクトです。最初の部分はフィルタリングされたデータを保持し、2番目の部分は情報を保持します。これらの値を出力し、firebaseログを見ると、以下が見つかります。

最初のオブジェクトを取得し、その中に常に表示される2番目の引用符をハードコーディングしています。これはくだらないプログラミングですが、ループしてランダムな引用符をいつでも表示できます。

4. index.js内の最終コード

// https://github.com/dialogflow/dialogflow-fulfillment-nodejsをご覧ください
// Dialogflowフルフィルメントライブラリドキュメント、サンプル、および問題の報告用
'use strict';
 
const functions = require( 'firebase-functions');
const {dialogflow} = require( 'actions-on-google');
const Datastore = require( '@ google-cloud / datastore');
//データストアクライアントをインスタンス化します
const datastore = Datastore();
const WELCOME_INTENT = 'デフォルトのウェルカムインテント';
const FALLBACK_INTENT = 'デフォルトフォールバックインテント';
const LOOKING_FOR_QUOTE_INTENT = 'LookingForQuote';
const QUOTE_TYPE_ENTITY = 'QuoteType';
const app = dialogflow();
app.intent(WELCOME_INTENT、(conv)=> {
    conv.ask( "Dr.Motivationへようこそ!友情、ロマンス、または動機についての引用を求めてください");
});
app.intent(FALLBACK_INTENT、(conv)=> {
    conv.ask( "つぶやきをやめて話す");
});
const query1 = datastore.createQuery( 'QuoteTable')。filter( 'QuoteType'、 '='、 'Motivational');
const query2 = datastore.createQuery( 'QuoteTable')。filter( 'QuoteType'、 '='、 'Friendship');
const query3 = datastore.createQuery( 'QuoteTable')。filter( 'QuoteType'、 '='、 "Romantic");
app.intent(LOOKING_FOR_QUOTE_INTENT、(conv)=> {
     const quote_type = conv.parameters [QUOTE_TYPE_ENTITY] .toLowerCase();
     if(quote_type == "motivational"){
         return datastore.runQuery(query1).then(results => {
            conv.ask(results [0] [1] .Quote);
        });
     } else if(quote_type == "friendship"){
        return datastore.runQuery(query2).then(results => {
            conv.ask(results [0] [1] .Quote);
        });
     } else if(quote_type == "romantic"){
     return datastore.runQuery(query3).then(results => {
            conv.ask(results [0] [0] .Quote);
        });
     } else {
         conv.ask( "私と話す代わりに、お尻を下ろして仕事をする");
     }
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

5.デプロイとテスト

かっこいいので、ここで何をしましたか?

コード内に引用符をハードコーディングする代わりに、フルフィルメントのインラインエディターを使用して、Googleクラウドデータストアから引用符を取得しています。

まあ、これでは十分ではありませんか?複雑な関数を作成するときは、より良いデバッグと、活用しているコードとパッケージのより良い制御が必要になる場合があります。そのため、開発環境をセットアップして、そこからコードをいじり始めることをお勧めします

次の章では、firebaseコマンドラインインターフェースとJSエディターを使用して開発をローカルマシンに移動し、クラウド機能として展開し、webhookを使用して同じことを行う方法について説明します。

このストーリーは、中規模企業の最大の起業家向け出版物The Startupに掲載されており、358,974人以上が続いています。

ここで私たちのトップストーリーを受け取るために購読してください。