Push-уведомления с использованием облачных функций Firebase в Firestore - PullRequest
0 голосов
/ 11 октября 2019

У меня проблемы с созданием кода JavaScript, который будет отправлять пользователю уведомление. У меня есть несколько вопросов и разъяснений, которые я хочу знать:

  • Почему у меня такая ошибка.
TypeError: Cannot read property 'userID' of undefined
    at exports.sendNotification.functions.firestore.document.onWrite.event (/srv/index.js:8:30)
    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)
  • А насчет tokenID, как мне это реализовать? Одноразовые вставки, когда пользователь регистрируется? или Каждый раз, когда пользователь, вошедший в идентификатор токена, будет обновляться?

Ниже приведен мой код на index.js:

'use strict'

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

exports.sendNotification = functions.firestore.document("Buyers/{userID}/Notifications/{notificationId}").onWrite(event => {
    const userID = event.params.userID;
    const notificationId = event.params.notificationId;
    console.log("BuyerID: "+userID);


    return admin.firestore().collection("Buyers").doc(userID).collection("Notifications").doc(notificationId).get().then(queryResult => {
    const notificationMessage = queryResult.data().notificationMessage;
    const notificationTitle = queryResult.data().notificationTitle;

    console.log("Title: "+notificationTitle);    
    console.log("Message: "+notificationMessage);    

    const toUser = admin.firestore().collection("Buyers").doc(userID).get();

        return Promise.all(toUser).then(result => {
            const tokenId = result[0].data().tokenId;

            const notificationContent = {
                notification: {
                    title: notificationTitle,
                    body: notificationMessage,
                    icon: "default",
                    sound : "default"
                } 
            };

        return admin.messaging().sendToDevice(tokenId, notificationContent).then(result => {
        console.log("Notification sent!");
        return null;
            });
        });
    })
});

ИВот пример структуры моей базы данных в firestore enter image description here

1 Ответ

0 голосов
/ 11 октября 2019

Вы используете очень старый синтаксис для триггеров облачных функций. API изменились с момента выхода бета-версии несколько лет назад. Обновите свой код до новых подписей, как показано в документации по триггерам Firestore . Триггеры теперь получают два аргумента вместо одного.

exports.sendNotification =
functions.firestore.document("Buyers/{userID}/Notifications/{notificationId}")
.onWrite((change, context) => {
    const userID = context.params.userID;
    const notificationId = context.params.notificationId;
    console.log("BuyerID: "+userID);

Если вы следуете старому учебнику, сообщите об этом его автору.

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