Не удается прочитать свойство get неопределенных функций Firebase - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь создать функцию, которая будет отправлять уведомление о том, обновлен ли документ.

Я получаю доступ к документу после его обновления и получаю идентификатор пользователя, который обновил этот документ, и статус, который мне нужен после этого я просто запрашиваю токен пользовательского устройства и отправляю полезную нагрузку, но кажется, что он не работает, я действительно не знаю, есть ли какие-то ошибки в синтаксисе кода или некоторые проблемы с моими обратными вызовами.

const functions = require('firebase-functions');
var admin = require("firebase-admin");

 {service keys are initialized here}     

    exports.onOrderCreated = functions.firestore
    .document('orders/{orderId}').onUpdate(async (snap,context) => {

        var db = admin.firestore();

        try{
            const orderDataSnap = await snap.ref.get();
            var userId = orderDataSnap.data().uid;
            var orderStatus = orderDataSnap.data().status;
        }catch(error){
            return handleErrorToUser(error,snap);
        }

        let docRef = db.collection('user').doc(userId);

       return docRef.get().then(userDoc => {
           const deviceToken = userDoc.get('deviceToken')
           const payload = {
            "data": {
                "title": "Your order status here !",
                "body": "Your order status is:"+orderStatus,
                "icon": "ic_launcher",
                "sound": "default",
                "click_action": "delete_token"
              }

            }
            return admin.messaging().sendToDevice(deviceToken,payload)
      });
    });

    // Inform about errors (these errors are for testing purposes, we should use StackDriver to log the errors 
    // to ourselves and let a friendly user error message with this function)
    async function handleErrorToUser(tError, snap) {
        console.log(tError)
      }

Внутри заказов Я должен получить эти два атрибута

uid и статус

Затем, используя этот uid, получить deviceToken внутри ссылки пользователя.

Этот код дает мне

 TypeError: Cannot read property 'get' of undefined
>     at exports.onOrderCreated.functions.firestore.document.onUpdate (/srv/index.js:17:46)
>     at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:131:23)
>     at /worker/worker.js:825:24
>     at <anonymous>
>     at process._tickDomainCallback (internal/process/next_tick.js:229:7)

Я не очень опытен с javascript, любая помощь будет оценена.

спасибо

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

У вас здесь несколько вещей не так.

Во-первых, имя первого аргумента вашей функции onUpdate должно, вероятно, не быть snap. Как видно из документации для onUpdate , первый аргумент - это объект Change, содержащий моментальные снимки документа для состояния документа «до» и «после» из-за произошедшего обновления. Этот объект Change не имеет свойство с именем ref, что приводит к сбою кода.

Во-вторых, если вы ожидаете, что этот код получит обновленный документ:

const orderDataSnap = await snap.ref.get();

В этом совершенно нет необходимости, поскольку содержимое документа уже доставляется в объекте Change, о котором я упоминал ранее. Просто используйте предоставленные вами данные, если вы точно не знаете, что это не то, что вам нужно.

Я предлагаю ознакомиться с документацией, чтобы лучше понять, как работают триггеры обновления.

1 голос
/ 10 апреля 2020

Я думаю, что проблема в этой строке:

const deviceToken = userDoc.get('deviceToken')

Если токен «deviceToken» является свойством из данных документа, вы должны сначала запустить метод данных, он возвращает все свойства данных документа:

const deviceToken = userDoc.data().deviceToken
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...