我创建了一个消息传递应用程序,并编写了一个函数,用于在发送新消息时向接收者发送推送通知。这是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()给了我一系列消息...我只需要知道如何获取最后一个元素即可。
谢谢