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

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

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

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

Cloud Firestore

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

JavaScript

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

Q&A

0回答

1066閲覧

firebaseのorderBy('created')が更新時に適応されない

tenten0114

総合スコア2

Firebase

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

Cloud Firestore

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

JavaScript

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

0グッド

0クリップ

投稿2021/03/26 00:05

前提・実現したいこと

firebaseのorderBy('created')を更新後も適応させたいです。更新時にも変わらず、送信時間順に表示させる方法をお教え頂きたいと思いこの質問をさせていただきました。何卒ご回答よろしくお願いします。

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

firebaseで簡単なチャットを作成している途中にmessageと一緒にTimestampsを入れてorderBy('created')で順番に表示させるようにしたんですが、collection('users').doc(uid)のなかで管理されているuserNameを取得するためにmessageを作成したと同時にそのmessageを作成した人のuidも一緒に管理してそこのuidとcollection('users').doc(uid)を結びつける事でcollection('users').doc(uid)の中に管理されているuserNameを表示している仕組みを作成したのですが、message作成時はなんの問題のなくorderBy('created')によって順に表示されるのですが、リロードなどの更新後に時間順が適応されずにユーザーごとにmessageが送信時間関係なしに振り分けられてしまいます。

該当のソースコード

javascript

1 2 const 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 13auth.onAuthStateChanged(user => { 14 15 if (user) { 16 me = user; 17 18 19 while (messages.firstChild) { 20 messages.removeChild(messages.firstChild); 21 } 22 23 collection.orderBy('created').onSnapshot(snapshot => { 24 snapshot.docChanges().forEach(async change => { 25 const myuid = user.uid 26 const uidData = change.doc.data().uid 27 const res = await db.collection('users').doc(uidData).get() 28 if (change.type === 'added') { 29 const li = document.createElement('li') 30 const d = change.doc.data() 31 if (res.exists) { 32 const userName = res.data().userName; 33 if ( d.uid != myuid) { 34 li.classList.add('your'); 35 li.textContent = userName + ':' + d.message; 36 } else { 37 li.textContent = d.message + ':' + userName; 38 } 39 messages.appendChild(li); 40 } 41 } 42 }); 43 },error => {}); 44 } 45 }); 46 47 const message = document.getElementById('message'); 48 const form = document.querySelector('form'); 49 const messages = document.getElementById('messages'); 50 const page = document.getElementById('page'); 51 52 form.addEventListener('submit', e => { 53 e.preventDefault(); 54 55 const val = message.value.trim(); 56 if (val === "") { 57 return; 58 } 59 60 message.value = ''; 61 message.focus(); 62 63 collection.add({ 64 message: val, 65 created: firebase.firestore.FieldValue.serverTimestamp(), 66 uid: me ? me.uid : 'nobody' 67 }) 68 .then(doc => { 69 console.log(`${doc.id} added!`); 70 }) 71 .catch(error => { 72 console.log('document add error!'); 73 console.log(error); 74 }); 75 });

試したこと

userNameの取得をせずにd.uidとだけした場合は問題なく順に表示されました。
なので問題はusersからuserNameを取得しているあたりだと考えています。

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

firestoreの構図 (例

collection('users').doc(uid) {
comment: "こんにちは"
userName: "tenten"
}

collection('chat') {
created: "Y年M月D日"
message: "Buenos días"
uid: "Ush384IUbsdur48"
}

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

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

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

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

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

hoshi-takanori

2021/03/26 03:32

snapshot.docChanges() で変更があったものだけ取得してるからでは。その後の処理も非同期なので順番は保証されないような…。
tenten0114

2021/03/26 10:26

となるとまた別でjs上で連番をつけてそこでもソートする必要があるって事ですか?
hoshi-takanori

2021/03/26 19:32

んー、React だったらデータをぜんぶ取得して render し直せば、あとは React が良きに計らってくれるわけですが、自分で生 DOM を更新する場合はいろいろ面倒くさそうですね。(回答になってなくてごめんなさい。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問