いつもお世話になっております。
Cloud FunctionとFirestoreを使ってスマホ用のチャットプッシュ通知を開発しようと考えています。
元々、RealTime Databaseで動いていたものをFirestore用に書き換えているのですが、どうも最初の部分でつまずいてしまいます。。
Cloud Functionでやるとなると、だいぶ勝手が変わってしまうものなのでしょうか。
開発環境は
firebase-functions: ^0.9.1
です。
エラー内容
TypeError: snapshot.data is not a function
ソースコード
JavaScript
1// message push notification 2exports.messagePush = functions.firestore 3.document('/rooms/{roomId}/users/{uid}/messages/{messageId}') 4.onWrite((snapshot) => { 5 console.log('snapshot:', snapshot); 6 7 const item = snapshot.data(); 8 const userId = item.child("user").child("_id").val(); 9 const userName = item.child("user").child("name").val(); 10 const message = item.child("text").val(); 11 12 console.log('item', item); 13 console.log('userId', userId); 14 15 const userRef = snapshot.params.uid; 16 17 console.log('userRef', userRef); 18 19 const payload = { 20 notification: { 21 body: userName + ": " + message, 22 badge: "1", 23 sound: "default" 24 } 25 } 26 27 if (userId !== userRef) { 28 getMessageFcmToken(userRef, function(token) { 29 pushToDevice(token, payload); 30 }); 31 } 32 33 var getMessageFcmToken = function(roomId, callback) { 34 admin.firestore().collection('users').doc(`${userRef}`) 35 .then((snapshot) => { 36 console.log('Valu', snapshot.data()); 37 const token = snapshot.data()['pushToken']; 38 39 if(token == null) { 40 console.log("Nothing token"); 41 return 42 } 43 console.log("return callback token", token); 44 45 callback(token); 46 }) 47 }
コンソール結果
下記がconsole.log('snapshot:', snapshot)
の結果になります。
snapshot
までは取れているみたいなのですが、なぜか、その先のsnaopshot.data()
でエラーが出てしまっています。
snapshot: { data: QueryDocumentSnapshot { _ref: DocumentReference { _firestore: [Object], _referencePath: [Object] }, _fieldsProto: { _id: [Object], createdAt: [Object], text: [Object], user: [Object] }, _readTime: undefined, _createTime: Timestamp { _seconds: 1535164240, _nanoseconds: 45967000 }, _updateTime: Timestamp { _seconds: 1535164240, _nanoseconds: 45967000 } }, eventId: '2c233f09-3c86-49f8-9171-c692ea0ecb35-0', eventType: 'providers/cloud.firestore/eventTypes/document.write', notSupported: {}, params: { roomId: 'FJG4k7sBe9Pdv4ns0TW9kt01yGo2', uid: 'dtsX83vbUtMlmoFJbqcwr6fJKiS2', messageId: 'MjSGIWPJe195uIcAdKWE' }, resource: 'projects/XXXXXXXXXX/databases/(default)/documents/rooms/FJG4k7sBe9Pdv4ns0TW9kt01yGo2/users/dtsX83vbUtMlmoFJbqcwr6fJKiS2/messages/MjSGIWPJe195uIcAdKWE', timestamp: '2018-08-25T02:30:40.045967Z' }
追記(8月25日)
JavaScript
1// message push notification 2exports.messagePush = functions.firestore 3.document('/rooms/{roomId}/users/{uid}/messages/{messageId}') 4.onWrite((change, context) => { 5 6 console.log('change', change); 7 8 const document = change.after.exists ? change.after.data() : null; 9 10 console.log('document', document); 11 12 const newDocument = change.after.data(); 13 console.log('newDocument', newDocument); 14 15 // Get an object with the previous document value (for update or delete) 16 const oldDocument = change.before.data(); 17 console.log('oldDocument', oldDocument); 18 19・・・
ご回答をいただきましたようにトライしてみました。
上記のように、冒頭を書き加えてみたのですが、下記のエラーが出てしまいました。
console.log('change', change);
は上と同じものを取得できましたは、exisits
が取得できず止まってしまいました。。
TypeError: Cannot read property 'exists' of undefined
続いて、existsの構文を消してやってみましたが、やはりデータのところでこけてしまいます。
TypeError: Cannot read property 'data' of undefined
回答1件
あなたの回答
tips
プレビュー