Облачные сообщения Firebase не отправляют push-уведомления. Значение аргумента "value" не является допустимым ограничением запроса. - PullRequest
0 голосов
/ 02 октября 2019

Я отправил следующее push-уведомление FCM в функции firebase:

import * as functions from 'firebase-functions';

import * as admin from 'firebase-admin';

admin.initializeApp();

exports.newSubscriberNotification = functions.firestore
    .document('messages/{id}')
    .onUpdate(async event => {
        const data = event.after.data();
        const content = data ? data.content : '';
        const toUserId = data ? data.toUserId : '';

        const payload = {
            notification: {
                title: 'New message',
                body: `${content}`
            }
        };

        const db = admin.firestore();
        const devicesRef = db.collection('devices').where('userId', '==', toUserId);

        const devices = await devicesRef.get();
        const tokens: any = [];

        devices.forEach(result => {
            const token = result.data().token;
            tokens.push(token);
          });

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

В коде, который я использую .onUpdate, который, как я полагаю, должен срабатывать при обновлении коллекции сообщений. Это приложение для обмена сообщениями, поэтому при каждом обновлении коллекции сообщений я хотел бы инициировать push-уведомление для принимающего пользователя.

Я получаю tuUserId и использую его для получения токена устройства этого пользователя отколлекция устройств. Сейчас я тестирую, так что toUserId идентичен идентификатору от userId, потому что он просто использует мое устройство ... так что, надеюсь, когда я обновлю message.doc (), он отправит push-уведомление.

Вот сообщениеколлекция в базе данных:

enter image description here

Это журнал ошибок функции:

11:04:22.937 PM
newSubscriberNotification
Function execution started
11:04:22.946 PM
newSubscriberNotification
Error: Value for argument "value" is not a valid query constraint. Cannot use "undefined" as a Firestore value.
    at Object.validateUserInput (/srv/node_modules/@google-cloud/firestore/build/src/serializer.js:273:15)
    at validateQueryValue (/srv/node_modules/@google-cloud/firestore/build/src/reference.js:1844:18)
    at CollectionReference.where (/srv/node_modules/@google-cloud/firestore/build/src/reference.js:956:9)
    at exports.newSubscriberNotification.functions.firestore.document.onUpdate (/srv/lib/index.js:19:49)
    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)
11:04:22.957 PM
newSubscriberNotification
Function execution took 21 ms, finished with status: 'error'

Я почти уверен, что ему не нравится мое предложение .where из-за этой ошибки: в CollectionReference.where (/ srv / node_modules / @ google-cloud / firestore/build/src/reference.js:956:9)

Я просто не уверен, почему

1 Ответ

1 голос
/ 02 октября 2019

Документ на вашем скриншоте содержит массив объектов, которые ваш код не обрабатывает. Вы пытаетесь прочитать toUserId из корня документа, где он не существует. Это означает, что ваше toUserId имеет значение undefined, на что Firestore жалуется.

Несколько необычно видеть несколько объектов / сообщений в одном документе, поэтому вам придется определить, действительно ли этолучший подходНо если это так, вам придется определить, на какой из этих объектов вы хотите отправить уведомление. Если вы хотите отправить всем этим объектам, вы можете зациклить их:

exports.newSubscriberNotification = functions.firestore
.document('messages/{id}')
.onUpdate(async event => {
  const allMessages = event.after.data();
  const db = admin.firestore();

  Object.keys(allMessages).forEach((index) => {
    let data = allMessages[index];

    const content = data ? data.content : '';
    const toUserId = data ? data.toUserId : '';

    const payload = {
        notification: {
            title: 'New message',
            body: `${content}`
        }
    };

    const devicesRef = db.collection('devices').where('userId', '==', toUserId);

    const devices = await devicesRef.get();

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