【はじめてのFirebase】第4話:cloud functionsとエミュレーターと私
おはこんばんちはaomaです。
記念日を通知する『KINENBI』というサービスを作ってます!
— aoma23 (@aoma23) 2021年1月12日
当日だけでなく100日後とか777日後とかキリ番にも通知します!
現在事前登録受付中です!拡散お願いします!#KINENBIhttps://t.co/0deleLPFQA
この物語はそんなaomaがはじめてのFirebaseに挑む壮大なアクションアドベンチャーである!第4話!
第4話の内容
- cloud functions実装できるようになる
- cloud functionsからメール送信
- firebaseのローカルエミュレーターを使えるようになる
本編
さて、cloud schedulerで良さそうなんだけど、これってどうやって使うんです??
— aoma23 (@aoma23) 2021年1月15日
Blazeプランにしてみた。
— aoma23 (@aoma23) 2021年1月15日
予算アラートなるものがあり、3段階で通知してくれるっぽい。便利だが予算オーバーしたタイミングでサーバーも請求もストップしてくれる設定ほしい。。高額請求こわい。
— aoma23 (@aoma23) 2021年1月15日
いんすとーるちう
— aoma23 (@aoma23) 2021年1月15日
firestoreのエミュレータ実行しようとしたらjdkがないぞと言われたのでインストールしてみる。https://t.co/XdmDLCQaKw
— aoma23 (@aoma23) 2021年1月15日
firestoreのエミュレータやっと動いた。というかcloudfunctionsも。
— aoma23 (@aoma23) 2021年1月15日
addMessage?text=uppercaseme
のとこスラッシュないとエラーになって動かなかった。
addMessage/?text=uppercaseme
とんだトラップだぜ。https://t.co/KfDFmnT9ql
さらに
— aoma23 (@aoma23) 2021年1月15日
functions.logger.log('Uppercasing', context.params.documentId, original);
がlogがないぜってエラーになってたので消した。
そして登録できたー。 pic.twitter.com/QeekhXxcLb
なんだろう。hostingからは本番のfirestore見に行っちゃう。。ローカルのエミュレータ見て欲しいのに。。
— aoma23 (@aoma23) 2021年1月15日
db.useEmulator("localhost", 8080);
— aoma23 (@aoma23) 2021年1月15日
って書いてあるのに、
db.useEmulator is not a function
ってエラーになるのなぜなんだぜ?https://t.co/wh5StLBgX3
firebaseのバージョン確認コマンドは
— aoma23 (@aoma23) 2021年1月15日
firebase -v
でも
firebase -version
でもなく、
firebase --version
バージョンは9.2.0だった。
— aoma23 (@aoma23) 2021年1月15日
これ見た感じ9.4.1ならいけるのか!?https://t.co/Wr3i14higi
[https://twitter.com/aoma23/status/1350072503163502593:embed#ローカルのバージョン関係なかった。よくよく見たらCDNで指定してるバージョンが古かった。。7.… https://t.co/7cY3RIjjDw]
なるほど。firebaseuiは諦めよう。 https://t.co/63kElS4HUV
— aoma23 (@aoma23) 2021年1月15日
なるほど。cloud functionsではリージョン指定をソースに書くのか。
— aoma23 (@aoma23) 2021年1月18日
.region("asia-northeast1")https://t.co/Fqv07Ry0zI
firebase emulators:start
— aoma23 (@aoma23) 2021年1月18日
いいね!ローカルエミュレーター簡単!
dayjsをnpm install。
— aoma23 (@aoma23) 2021年1月18日
cloud functionsで使うにはfunctionsフォルダ配下で
npm install dayjs
すればよさそう。
firestoreエミュレータたちあがらなくなったのでこれ見てるhttps://t.co/V7YyJnknaK
— aoma23 (@aoma23) 2021年1月18日
8080と9000のポートkillしたら立ち上がったー!よかった。
— aoma23 (@aoma23) 2021年1月18日
console.log('テストです');
— aoma23 (@aoma23) 2021年1月18日
でログ仕込んで、
http://localhost:5001/maday-eeeee/asia-northeast1/notifyDays
でcloud functions実行して、
http://localhost:4000/logs
でログ確認してる。
firestoreのtimestampで日(DD)や月日(MMDD)が一致するデータを取得したかったけど、範囲指定くらいしかないっぽい。。。
— aoma23 (@aoma23) 2021年1月18日
どうするか。。
全部取得して判定するのも微妙だし、日や月日だけのフィールドを設けるにするか。微妙だけど。
この前書いた設計書がげきくそ役に立ってる!
— aoma23 (@aoma23) 2021年1月18日
foreach内でawaitしたら並行して動いてしまうのね。。
— aoma23 (@aoma23) 2021年1月18日
まさにこのQiitaの通りにハマった。
さてどうしようかな。。処理的にはpromise.allが良いのだけど、開発中は順番わかってたほうが実装しやすいのよね。。https://t.co/Q0PUHMEx4T
cloud functionsからメール飛ばしたい。
— aoma23 (@aoma23) 2021年1月19日
send grid使ってみるか。
sendgrid申し込んだけどすぐには使えないのか。。
— aoma23 (@aoma23) 2021年1月19日
一応参考になりそうな記事をペタ。https://t.co/rHKQtn1pPO
こっちのがよさそう?https://t.co/p82TZ7BasI
— aoma23 (@aoma23) 2021年1月19日
GmailとNodemailerを使ってみるか。https://t.co/4T9OWyQCfK
— aoma23 (@aoma23) 2021年1月19日
こっちでも。https://t.co/Gv0FIDJn8n
— aoma23 (@aoma23) 2021年1月19日
実行しました!
— aoma23 (@aoma23) 2021年1月19日
// functionsディレクトリへ移動
cd functions
// Nodemailerインストール
npm install --save nodemailer
const gmailEmail = functions.config().gmail.email;
— aoma23 (@aoma23) 2021年1月19日
const gmailPassword = functions.config().gmail.password;
で環境変数取得するために下記コマンド実行したよ!
firebase functions:config:set https://t.co/T1iI1pFvJp="hoge@gmail.com" gmail.password="fugafuga"
エミュレータで環境変数取得したいときはfunctionsディレクトリ配下で下記を実行する必要があったよ!
— aoma23 (@aoma23) 2021年1月19日
firebase functions:config:get > .runtimeconfig.json
gmailの設定変更して
— aoma23 (@aoma23) 2021年1月19日
安全性の低いアプリの許可: 有効
にしてあげる必要があった!https://t.co/EaAqMnEaCE
メール送信できたー!
— aoma23 (@aoma23) 2021年1月19日
ユーザーのメアド一覧取得したいけどAuthenticationから一括取得って100件までなのか。
— aoma23 (@aoma23) 2021年1月19日
これはユーザー情報をfirestoreで別途管理しとくのが良さそうなのかな。https://t.co/8rdC3LhE1E
アカウント作成時にcloud functionsでユーザー情報保存かなー。https://t.co/rVhFM7JEmH
— aoma23 (@aoma23) 2021年1月19日
functions.auth.user().onCreateのテストしたいけどfirebaseUI使っててエミュレーター側のauthenticationに書き込まれない。
— aoma23 (@aoma23) 2021年1月20日
そんなときはエミュレータの画面から直接addUserしちゃえばOK! pic.twitter.com/XEGweIeeXJ
だいたい実装できたぞ。
— aoma23 (@aoma23) 2021年1月20日
さて動作確認のためにonRequestで実行してたけど、やりたいのは1日1回の定期実行なのよね。
.https.onRequest
— aoma23 (@aoma23) 2021年1月20日
を
.pubsub.schedule('00 7 * * *').timeZone('Asia/Tokyo').onRun(async (context) => {
にしてあげれば良さそう。
contextって何が入ってるんだろうと思ったら調べてくれてる人いた!ありがたい!https://t.co/MkOSgi4eQo
よし。デプロイも完了!
— aoma23 (@aoma23) 2021年1月20日
あとは明日実行されてればOKだ。
To Be Continued...