错误TS2532:对象可能是'undefined'。推动Firebase云功能

时间:2019-10-02 17:12:05

标签: javascript typescript firebase firebase-cloud-messaging

我创建了一个消息传递应用程序,并编写了一个函数,用于在发送新消息时向接收者发送推送通知。这是FCM日志:

8:51:19.963 AM
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:21: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)
8:51:19.886 AM
newSubscriberNotification
content undefined
8:51:19.883 AM
newSubscriberNotification
data { message: 
   [ { content: 'Blah',
       createdAt: 1569162489991,
       toUserId: 'xxxxxxx',
       userId: 'xxxxxxxx' },
     { content: '1',
       createdAt: 1569725577734,
       toUserId: 'xxxxxxx',
       userId: 'xxxxxxxxxxx' },
     { content: 'tester',
       createdAt: 1569984794517,
       toUserId: 'xxxxxxx',
       userId: 'xxxxxxxxx' } ] }

从FCM日志中,我意识到我的where子句中有一个问题,另一位发帖人指出我正在提取一个数组,这就是为什么我的where子句不起作用的原因。所以现在我正在尝试访问数组的最后一个元素

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 : '';
        const toUserId = data ? data.toUserId : '';

        console.log('data', data);
        console.log('Length', data.message.length);

        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);
    });

现在写,我只想要data.message的长度,这样我就可以获取消息数组的最后一个元素,因为我只在乎发送的最后一条消息...从该消息中获取toUserId并发送推送通知给那个用户。问题是,当我尝试推送此功能时,我不断受到限制,因为data.message.length可能不确定。

我也遇到了

的那些错误
    const content = data ? data : '';
    const toUserId = data ? data.toUserId : '';

所以我添加了if语句以确保它们不为null。但是我不确定该如何解决...我需要访问const data = event.after.data();中的最后一个元素。 然后使用toUserId获取设备令牌以发送推送通知。

从控制台日志事件中可以看到。after.data()给了我一系列消息...我只需要知道如何获取最后一个元素即可。

谢谢

0 个答案:

没有答案