質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

662閲覧

Cloud Firestoreからのデータ取得方法

Khy

総合スコア118

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/05/28 16:15

編集2019/05/29 02:53

Vue.jsとFirebaseでチャットアプリを制作しております。

FirebaseのCloud Functionsを使用し、トークルームに新しいメッセージを投稿するとメールに通知を送れるようにしたいです。

受信者のメールアドレスをCloud Firestoreから取得してきたいのですが、以下のコードの一番下の部分で上手く取得できておりません。

何が原因でしょうか?初歩的な質問かもしれませんが、お力を貸して頂けると助かります。

const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); const db = admin.firestore() const nodemailer = require("nodemailer"); const gmailEmail = functions.config().gmail.email const gmailPassword = functions.config().gmail.password const mailTransport = nodemailer.createTransport({ service: 'gmail', auth: { user: gmailEmail, pass: gmailPassword } }) // トークルームに変更があればメールで通知 exports.sendNotification = functions.firestore .document('talkrooms/{roomId}').onUpdate((change) => { const room = change.after.data(); const chat = room.chat; if(chat.length !== 0){ const newMessage = chat[chat.length-1]; //送信者と受信者のIDを取得 var sendUserID = newMessage.person; var receiveUserId; if(room.member[0].id == sendUserID){ receiveUserId = room.member[1].id; }else{ receiveUserId = room.member[0].id; } //受信者のデータを取得 var receiversData; db.collection('users').doc(receiveUserId).get() .then((doc)=>{ if (doc.exists) { console.log("Document data:", doc.data()); //ここでは正常に表示されます。     receiversData = doc.data(); } }).catch(function(error) { console.log("Error getting document:", error); }); console.log(receiversData); //ここではデータが表示されません。 . . .

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xenbeat

2019/05/28 23:33

タグ「Vue.js」は今回の質問に全く関係ないので「JavaScript」や「Node.js」を代わりに追加ください。
Khy

2019/05/29 02:54

ご指摘ありがとうございます。タグを修正致しました。
guest

回答1

0

ベストアンサー

以下のコードの一番下の部分で上手く取得できておりません。何が原因でしょうか?

.thenの中のreceiversData = doc.data();は非同期で処理されるので、
一番下のconsole.log(receiversData);が先に呼び出されてreceiversDataundefinedになっているのが原因でしょう。

var receiversDataを使う必要はないですが、既存コードを極力流用するなら「//※追加」の行を加えれば上手くいくと思います。

Javascript

1var receiversData; 2db.collection('users').doc(receiveUserId).get() 3 .then((doc) => { 4 if (doc.exists) { 5 console.log("Document data:", doc.data()); //ここでは正常に表示されます。 6 receiversData = doc.data(); 7 } 8 }).then(() => { //※追加 9 console.log(receiversData); //※追加 10 }).catch(function (error) { 11 console.log("Error getting document:", error); 12 });

投稿2019/05/28 23:25

編集2019/05/29 01:14
xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Khy

2019/05/29 02:56

ご回答ありがとうございます。 無事解決いたしました。 Promiseや非同期処理に関してまだまだ理解不足なので、もっと理解を深めていけるよう頑張ります。 ご丁寧にありがとうございました!
xenbeat

2019/05/29 03:41 編集

解決できてよかったですー > Promiseや非同期処理に関してまだまだ理解不足なので、もっと理解を深めていけるよう頑張ります。 そうですね!そちらがある程度理解できるようになりましたら、async/await 構文での実装をオススメいたします。 ※async/await 構文を使うには、Node.jsのバージョンを8以上にする必要がありますのでご留意ください。 https://firebase.google.com/docs/functions/manage-functions#set_nodejs_version
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問