TypeError:result [0] .data不是一个函数

时间:2019-05-13 12:26:47

标签: node.js firebase google-cloud-firestore google-cloud-functions

我有一个功能,当有人添加评论时,该功能应该发送通知。 但是此错误显示在日志中。

TypeError: result[0].data is not a function
    at Promise.all.then.result (/srv/lib/index.js:19:35)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

这是我的功能。这是怎么了如何更改呢?

/*eslint-disable */

const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp();

exports.apptTrigger = functions.firestore.document("Comments/{anydocument}").onCreate((snap, context) =>  {

    const receiver = snap.data().idUserImage;

    const messageis = snap.data().comment;


    const toUser = admin.firestore().collection("token").where('idUser', '==', receiver).get();


    return Promise.all([toUser]).then(result => {

      const tokenId = result[0].data().token;

    const notificationContent = {
           notification: {
              title: "Dodano komentarz",
              body: messageis,
              icon: "default",
              sound : "default"
            }};
               return admin.messaging().sendToDevice(
                    tokenId,
                    notificationContent
                ).then(results => {
            console.log("Notification sent!");
            //admin.firestore().collection("notifications").doc(userEmail).collection("userNotifications").doc(notificationId).delete();
          });
        });
});

2 个答案:

答案 0 :(得分:2)

这是正常现象,因为Query的{​​{3}}方法返回的承诺会返回get(),其中“包含零个或多个代表查询结果的DocumentSnapshot对象”。因此,data()没有result[0]方法。

QuerySnapshot文档(上面的链接)说:

  

可以通过 docs 属性以数组形式访问文档,或者   使用forEach方法枚举。文件数量可以   通过empty和size属性确定。

因此,您应该使用QuerySnapshot属性,该属性将返回“ QuerySnapshot中所有文档的数组”,并执行以下操作:

const tokenId = result[0].docs[0].data().token;

但是请注意,您不需要使用Promise.all,因为您将仅包含一个元素的数组传递给它。您只需要使用QuerySnapshot返回的get()并使用其docs属性,如下所示:

exports.apptTrigger = functions.firestore
  .document('Comments/{anydocument}')
  .onCreate((snap, context) => {
    const receiver = snap.data().idUserImage;
    const messageis = snap.data().comment;

    const toUser = admin
      .firestore()
      .collection('token')
      .where('idUser', '==', receiver)
      .get();

    return toUser
      .then(querySnapshot => {
        const tokenId = querySnapshot.docs[0].data().token;

        const notificationContent = {
          notification: {
            title: 'Dodano komentarz',
            body: messageis,
            icon: 'default',
            sound: 'default'
          }
        };

        return admin.messaging().sendToDevice(tokenId, notificationContent);
      })
      .then(results => {   //If you don't need the following console.log() just remove this then() 
        console.log('Notification sent!');
        return null;
      });
  });

答案 1 :(得分:1)

错误指出“ result [0] .data”不起作用。但是,您正在从result [0]对象访问“数据”作为函数。

 const tokenId = result[0].data().token;

您可能必须将以上代码行更改为

const tokenId = result[0].data.token;

但是在此之前,我建议检查是否定义了“数据”本身。

const tokenId;
if(result[0].data)
  tokenId = result[0].data.token;