前提・実現したいこと
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"
}
あなたの回答
tips
プレビュー