<aside> 💫 ローカルで持っていたデータを、Firestoreに移して、データベースで値の受け取りをするよ!

</aside>

<aside> 💫 Cloud Functionsとは 完全にサーバーレスでアプリケーションを実行できるサービス。 呼び出された時だけ実行する、サーバーレスな仕組みを作れる。 =サーバーレスなAPIを作ることができる。

REST APIとは Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つ。 ****httpにGET/POSTのメソッドを持たせた状態でリクエストを投げると、欲しいレスポンスを返してくれるもの。 参考①:REST APIとは?ざっくりと理解してみる【初心者向け】 参考②:0からREST APIについて調べてみた

</aside>

REST APIを作り、Firestore Databaseにデータを追加する

https://www.youtube.com/watch?v=vzqJBxYe4WA&list=PLX8Rsrpnn3IVOk48awq_nKW0aFP0MGpnn&index=10
dataset.jsは、ローカルで持っていたデータファイルのこと。※チャットボットアプリの場合

https://www.youtube.com/watch?v=vzqJBxYe4WA&list=PLX8Rsrpnn3IVOk48awq_nKW0aFP0MGpnn&index=10 dataset.jsは、ローカルで持っていたデータファイルのこと。※チャットボットアプリの場合

dataset.jsをjsonファイルに変える

  1. dataset.jsの拡張子を「.json」に変更する(普通にファイル名を変更するだけでOK)
  2. dataset.jsonファイルのコードをJSON形式に書き直していく
    1. ただのオブジェクトの配列にする(constなど、jsで使う構文を削除する)

      <aside> 💫 ・const ~などの定数名は、定数名ごと削除してOK!  最初から{} で始まるようにしよう! ・export default〜も削除 ・キーは全てダブルクォーテーションで囲う ・配列の最後のカンマは削除

      </aside>

▼変更前(オレンジ色が要変更箇所)

**const defaultDataset =** {
  **init**: {
    **answers**: [
      { **content**: "仕事を依頼したい", **nextId**: "job_offer" },
      {
        **content**: "エンジニアのキャリアについて相談したい",
        **nextId**: "consultant"**,**
      },
      { **content**: "学習コミュニティについて知りたい", **nextId**: "community" },
      { **content**: "お付き合いしたい", **nextId**: "dating" }**,**
    ],
    **question**: "こんにちは!🐯トラハックへのご用件はなんでしょうか?"**,**
  },
  **job_offer**: {
		・
		・
		・

▼変更後

{
  "init": {
    "answers": [
      { "content": "仕事を依頼したい", "nextId": "job_offer" },
      {
        "content": "エンジニアのキャリアについて相談したい",
        "nextId": "consultant"
      },
      { "content": "学習コミュニティについて知りたい", "nextId": "community" },
      { "content": "お付き合いしたい", "nextId": "dating" }
    ],
    "question": "こんにちは!🐯トラハックへのご用件はなんでしょうか?"
  },
  "job_offer": {
		・
		・
		・

Cloud Fonctionsでhttps関数の作成

  1. プロジェクトフォルダの中にある「functions」フォルダから「src」フォルダを開き、「index.ts」を開く

    <aside> 💫 jsで作成していたらindex.jsになっているよ!今回はTypeScriptで作成していたので、index.tsになっているよ

    </aside>

    スクリーンショット 2022-05-27 15.00.32.png

  2. index.tsファイルにimport、https関数を記述する ※デフォルトで書かれているコード(コメントアウトされたもの)は全て削除してOK!

    ▼こんなコード

    スクリーンショット 2022-05-27 14.57.34.png

    import * as functions from "firebase-functions";
    import * as admin from "firebase-admin";
    admin.initializeApp(); //adminを初期化
    const db = admin.firestore(); //admin権限でfirestoreを操作する
    
    /*
     * APIを叩くと必ずレスポンスを返すのだが、そのレスポンスを返すための関数を作ってあげる
     * Cloud Functions内でしか呼び出されないので、exportはいらない。
     */
    const sendResponse = (response: functions.Response, statusCode: number, body: any) => {
        response.send({
            statusCode,
            body: JSON.stringify(body)
        });
    }
    
    export const addDataset = functions.https.onRequest(async (req: any, res: any) => {
        //任意の処理
    });
    

    <aside> ⚠️ Cloud Functionsでfunctionをデプロイするときは、必ずexport をつけること! exportされていない関数は、Cloud Functionsのローカルの中でしか使えない=外部から叩けなくなる。

    onRequest()メソッドの中ではコールバック関数を書く async は、非同期処理をおこないたいので書く。

    reqはrequest, resはresponseの略

    req: any, res: any はTypeScriptの書き方。型を提示しないといけないため、この書き方になる。 ちなみにany は「型はなんでもいいよ〜」の意らしい。

    </aside>

    import * as functions from "firebase-functions";
    import * as admin from "firebase-admin";
    admin.initializeApp(); //adminを初期化
    const db = admin.firestore(); //admin権限でfirestoreを操作する
    
     /**
     * APIを叩くと必ずレスポンスを返すのだが、そのレスポンスを返すための関数を作ってあげる
     * Cloud Functions内でしか呼び出されないので、exportはいらない。
     */
    const sendResponse = (response: functions.Response, statusCode: number, body: any) => {
        response.send({
            statusCode,
            body: JSON.stringify(body)
        });
    }
    
    export const addDataset = functions.https.onRequest(async (req: any, res: any) => {
        if (req.method !== 'POST') {
            sendResponse(res, 405, { error: 'Invalid Request!' });
        } else {
            const dataset = req.body;
            for (const key of Object.keys(dataset)) {
                /**
                 * await: 非同期処理の実行を一時停止し、Promiseが決定・履行された後に処理を再開する。即時関数ともいうらしい。
                 * <https://qiita.com/katsukii/items/cfe9fd968ba0db603b1e>
                 * questions: firestoreにquestionsというコレクションを作成する。その中にデータを入れていく
                 * doc: documentの意。keyを引数に入れたので、initやjob_offerといったkeyのdocumentがfirestoreに作成される。
                 * そしてその中に各データが格納されていく
                 * <https://firebase.google.com/docs/firestore?hl=ja>
                 */
                const data = dataset[key];
                await db.collection('questions').doc(key).set(data);
            }
            sendResponse(res, 200, { message: 'Successfully added dataset!' });
        }
    });
    

デプロイ

  1. ターミナルを開き、cd~で該当プロダクトフォルダまで移動する

  2. firebase deploy コマンドを実行する

    <aside> ⚠️ このとき、eslintのチェックでインデントが多いだの少ないだの、文字数が多すぎるだのエラーが出ることがある

    その際はしらみつぶしに自力で修正するのもありだが、VSCodeのプラグインで自動修正することもできる(みたい) 設定が面倒なので、覚悟して・・・プロジェクトごとに設定しないとダメだよとか、色々言われているから・・・

    でもこれさえ頑張ればデプロイは成功も同然!!

    </aside>

  3. Firebaseで該当プロジェクトを開き、サイドバーから「Functions」をクリック

    データが追加されているか確認する

スクリーンショット 2022-05-27 22.30.55.png

スクリーンショット 2022-05-27 22.31.31.png

  1. 追加されたデータの「リクエスト」下にあるURLをコピーしておく ※このURLを使ってcurlコマンドを叩いていくよ

curlでAPIを叩く

▼書くコードはこれ