Ошибка типа: результат [0]. Данные не являются функцией - PullRequest
0 голосов
/ 13 мая 2019

У меня есть функция, которая должна отправлять уведомления, когда кто-то добавляет комментарий. Но эта ошибка отображается в журнале.

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 ]

2 голосов
/ 13 мая 2019

Это нормально, поскольку обещание, возвращаемое методом get() для Query, возвращает QuerySnapshot, который "содержит ноль или более объектов DocumentSnapshot, представляющих результаты запрос". Поэтому для result[0].

не существует метода data().

Документация QuerySnapshot (ссылка выше) гласит:

Документы могут быть доступны в виде массива через свойство docs или перечисляется с использованием метода forEach. Количество документов может быть определяется через свойства empty и size.

Поэтому вам следует использовать свойство docs, которое возвращает «массив всех документов в 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 голос
/ 13 мая 2019

Ошибка гласит, что «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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...