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

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

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

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

Q&A

0回答

984閲覧

firebaseでUserNameを表示する方法

tenten0114

総合スコア2

Firebase

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

0グッド

0クリップ

投稿2021/03/26 14:32

前提・実現したいこと

firebaseでチャットを作成する為にuserNameをmessageの横に表示させたいです。
また、過去のmessageコードと送信するためのコードを分ける必要がない、簡単な方法がある場合は教えて頂きたいです。

発生している問題・エラーメッセージ

更新時に誤作動が起きてしまうので送信するコードと過去のmessageを表示するコードを別にしようと思います。
しかしuserNameを別のコレクションから取得する際にならんかの誤作動が出てしまい、上手く作動しない、または表示されない事に困っています。consoleを見てもエラーは出ていないので間違った取得をしているのかと思います。

該当のソースコード

JavaScript

1 2const db = firebase.firestore(); 3 db.settings({ 4 timestampsInSnapshots: true 5 }); 6 7 8 const collection = db.collection('chat'); 9 10 const auth = firebase.auth(); 11 let me = null; 12 13 const message = document.getElementById('message'); 14 const form = document.querySelector('form'); 15 const messages = document.getElementById('messages'); 16 const page = document.getElementById('page'); 17 18auth.onAuthStateChanged(user => { 19 20 if (user) { 21 me = user; 22 23 24 while (messages.firstChild) { 25 messages.removeChild(messages.firstChild); 26 } 27 28 /*過去のmessageを表示させる*/ 29 collection.orderBy('created').get().then(snapshot => { 30 snapshot.forEach(doc => { 31 const uidData = doc.data().uid 32 const res = db.collection('users').doc(uidData).get() 33 const userName = res.data().userName; 34 const myuid = user.uid 35 const li = document.createElement('li') 36 const d = doc.data() 37 if ( d.uid != myuid) { 38 li.classList.add('your'); 39 li.textContent = d.uid.substr(0, 4) + ':' + d.message; 40 } else { 41 li.textContent = d.message + ':' + d.uid.substr(0, 4); 42 } 43 messages.appendChild(li); 44 }); 45 },error => {}); 46 47 /*これから送信されるmessageのコード*/ 48 collection.orderBy('created').where('created','>=', new Date).onSnapshot(snapshot => { 49 snapshot.docChanges().forEach(async change => { 50 const myuid = user.uid 51 const uidData = change.doc.data().uid 52 const res = await db.collection('users').doc(uidData).get() 53 if (change.type === 'added') { 54 const li = document.createElement('li') 55 const d = change.doc.data() 56 if (res.exists) { 57 const userName = res.data().userName; 58 if ( d.uid != myuid) { 59 li.classList.add('your'); 60 li.textContent = userName + ':' + d.message; 61 } else { 62 li.textContent = d.message + ':' + userName; 63 } 64 messages.appendChild(li); 65 console.log(d.message); 66 } 67 console.log(li); 68 console.log(d); 69 } 70 console.log(res); 71 }); 72 },error => {}); 73 } 74 }); 75 76 form.addEventListener('submit', e => { 77 e.preventDefault(); 78 79 const val = message.value.trim(); 80 if (val === "") { 81 return; 82 } 83 84 message.value = ''; 85 message.focus(); 86 87 collection.add({ 88 message: val, 89 created: firebase.firestore.FieldValue.serverTimestamp(), 90 uid: me ? me.uid : 'nobody' 91 }) 92 .then(doc => { 93 console.log(`${doc.id} added!`); 94 }) 95 .catch(error => { 96 console.log('document add error!'); 97 console.log(error); 98 }); 99 });

試したこと

以上の”過去のmessageを表示するコード”のようにuserNameを使わずにuidのみで表示させようとすると問題なく表示されます。

補足情報(FW/ツールのバージョンなど)

firestoreのデータ詳細

users {
comment: "Hello"
userName: "太郎"
}

chat {
created: "Y-M-D"
message: "Hola"
uid: "oei183OIj320UdO"
}

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

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

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

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

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

hoshi-takanori

2021/03/26 19:43

const res = db.collection('users').doc(uidData).get() が非同期だからですね…。
tenten0114

2021/03/26 23:00

hoshi-takanoriさんならどのように変更されますか?差し支えなかければよろしくお願いします。
hoshi-takanori

2021/03/26 23:17

とりあえず仮の名前を表示しといて、非同期で名前を取得したら表示を更新する、というのを Android では書いたことがありますが、JS では書いたことないです。 JS でもたぶん同様のロジックでいけると思いますが、DOM を直接いじって表示を更新する処理は書きたくないです。(ので、React を使うと思います。)
tenten0114

2021/03/27 00:10

わかりました。ありがとうございます。Reactで最初からやります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問