<aside> 💫 ローカルで持っていたデータを、Firestoreに移して、データベースで値の受け取りをするよ!
</aside>
<aside> 💫 Cloud Functionsとは 完全にサーバーレスでアプリケーションを実行できるサービス。 呼び出された時だけ実行する、サーバーレスな仕組みを作れる。 =サーバーレスなAPIを作ることができる。
REST APIとは Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つ。 ****httpにGET/POSTのメソッドを持たせた状態でリクエストを投げると、欲しいレスポンスを返してくれるもの。 参考①:REST APIとは?ざっくりと理解してみる【初心者向け】 参考②:0からREST APIについて調べてみた
</aside>

https://www.youtube.com/watch?v=vzqJBxYe4WA&list=PLX8Rsrpnn3IVOk48awq_nKW0aFP0MGpnn&index=10 dataset.jsは、ローカルで持っていたデータファイルのこと。※チャットボットアプリの場合
ただのオブジェクトの配列にする(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": {
・
・
・
プロジェクトフォルダの中にある「functions」フォルダから「src」フォルダを開き、「index.ts」を開く
<aside> 💫 jsで作成していたらindex.jsになっているよ!今回はTypeScriptで作成していたので、index.tsになっているよ
</aside>

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

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!' });
}
});
ターミナルを開き、cd~で該当プロダクトフォルダまで移動する
firebase deploy コマンドを実行する
<aside> ⚠️ このとき、eslintのチェックでインデントが多いだの少ないだの、文字数が多すぎるだのエラーが出ることがある。
その際はしらみつぶしに自力で修正するのもありだが、VSCodeのプラグインで自動修正することもできる(みたい) 設定が面倒なので、覚悟して・・・プロジェクトごとに設定しないとダメだよとか、色々言われているから・・・
でもこれさえ頑張ればデプロイは成功も同然!!
</aside>
Firebaseで該当プロジェクトを開き、サイドバーから「Functions」をクリック
データが追加されているか確認する


▼書くコードはこれ