我正在为我的iOS应用程序编写一个云函数,用于监视用户中的任何关注者变化,以便在有人关注他们时通知他们。我的关注者子集位于每个用户数据文档中,我使用通配符来监听任何变化。我还在每个步骤中提供了良好的日志记录,因此很容易看出问题所在,然而,由于我对云函数相当陌生,我不知道该怎么补救。
云函数如下所示。
const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()
let title
let body
let payload
let FCMRegistrationToken_KEY
exports.sendNotificationOnFollowerCreate = functions.firestore
.document('Users/{userID}/Followers/{followerID}')
.onCreate((snapshot, context) => {
if(snapshot.after){
// Get the userId and followerId
const userID = context.params.userID;
const followerID = context.params.followerID;
// Get the data of the follower document
const newData = snapshot.after.data()
const fullName = newData.firstName + " " + newData.lastName
title = 'Someone just followed you'
body = fullName + ' Just followed you right now!\n' + 'username: ' + newData.userName
// Create the notification payload
payload = {
notification: {
title: title,
body: body
}
}
// Get FMC token by fetching the FCMToken Document for the userID above.
admin.firestore().collection('FCMTokens').doc(userID).get().then(doc => {
if(!doc.exists) {
console.log('User not found!');
} else {
// Get the data of the document
const data = doc.data();
console.log(data);
FCMRegistrationToken_KEY = data.token
}
})
.catch(error => {
console.log(error);
})
.finally(() => {
//more code here
// Send the notification
admin.messaging().sendToDevice(FCMRegistrationToken_KEY, payload)
.then(response => {
console.log('Notification sent successfully:', response);
})
.catch(error => {
console.log('Error sending notification:', error);
});
});
}
})
基本上,当有新的追随者添加时,我使用上下文参数中的userID来获取我为FCMTokens集合中的所有用户保存的FCM令牌。在获取令牌并创建有效负载后,我通过admin. messaging()调用sendToDevice(),但由于某种原因,它失败了。
但是,它在此之后立即失败,并给出以下错误
{
"textPayload": "Function returned undefined, expected Promise or value",
"insertId": "63c38ba0000e2c35c9c62c1d",
"resource": {
"type": "cloud_function",
"labels": {
"function_name": "sendNotificationOnFollowerCreate",
"region": "us-central1",
"project_id": "fir-eris"
}
},
"timestamp": "2023-01-15T05:14:08.928821Z",
"severity": "WARNING",
"labels": {
"execution_id": "no23uq1mg5a3",
"instance_id": "00c61b117c173e48fc2cb6c3b49f2c059090e49b7252db1b187115bd42a62998c4093f283fe06ba4ec0bf7981f108fcadb527843a8c4b3c77ec1"
},
"logName": "projects/fir-eris/logs/cloudfunctions.googleapis.com%2Fcloud-functions",
"trace": "projects/fir-eris/traces/e0d7dfae3ea1340e1ec101d16defc94b",
"receiveTimestamp": "2023-01-15T05:14:09.204309551Z"
}
我完全被搞糊涂了,因为我真的没有那么多云功能的经验。有人能告诉我发生了什么事,什么可能是一个潜在的解决办法吗?
谢谢你。
1条答案
按热度按时间5m1hhzi41#
你在问题中提到的错误基本上是当一个函数没有或错误地有一个return语句时看到的。你的云函数的代码似乎没有任何return语句会有一个承诺返回。为了确保云函数知道你的代码什么时候完成,你需要从顶层函数返回一个值(在所有工作同步发生的情况下),或者从顶层函数返回一个承诺(在函数关闭后某些工作继续的情况下)。
当触发器函数完成时,
sendNotificationOnFollowerCreate
可能会被中止,因为它没有等待该承诺。尝试添加返回类似于下面的示例:
还请检查以下具有类似实现的示例: