Firestore 云功能按预期在模拟器上运行,但在部署到 Firestore 后却不起作用
Firestore cloud function working on emulator as expected but not after deployment on firestore
我的云函数在 firebase 模拟器上运行良好,尽管在部署到 firestore 后,它无法运行。尽管没有任何反应,函数仍然执行。
在引入 statusValue 的 if 语句之前,它在 firestore 中工作。虽然,即使在引入 if 语句之后,它仍然在模拟器中按预期工作。
我已经删除并重新部署了功能并安装了最新版本的节点,但没有成功。
感谢帮助!
const functions = require("firebase-functions");
const admin = require('firebase-admin');
admin.initializeApp();
// capture group members when a new message is added to a group to notify them
exports.newMessage = functions.region('australia-southeast1')
.firestore
.document('ChatRooms/{chatRoomsID}/Messages/{messageID}')
.onCreate(async (snap, context) => {
const messageData = snap.data();
const messageSender = messageData.fullName;
// access the documentRef at collection level
const chatRoomRef = snap.ref.parent.parent;
// access the data at collection level
const chatRoomSnap = await chatRoomRef.get();
const chatRoomData = chatRoomSnap.data();
const groupMembers = chatRoomData.members;
const activeUsers = chatRoomData.activeUserStatus;
const chatRoomTitle = chatRoomData.chatRoomTitle;
const notificationTitle = `ChatRoom: ${chatRoomTitle}`
const notificationBody = `${messageSender} sent a message`;
groupMembers.forEach((item, i) => {
const statusValue = activeUsers[item]
if (statusValue == 0) {
const topic = item.replace(/[^a-zA-Z0-9]/g,'-');
const message = {
notification : {
title : notificationTitle,
body: notificationBody
},
apns: {
payload: {
aps: {
sound : `default`
}
}
},
topic: topic,
};
// send notification subscribed to topic
admin.messaging().send(message).then((response) => {
console.log(`Successfully sent message to ${topic}`, response);
}).catch((error) => {
console.log('Error sending message:', error);
});
};
});
});
以上是在模拟器中运行,查看日志:
i 个函数:开始执行“australia-southeast1-newMessage”
i 功能:在 ~1s
中完成“australia-southeast1-newMessage”
成功发送消息至5-3-com项目/
已成功向 3-4-com 项目发送消息/
当部署到 firestore 中时,firestore 函数中的日志显示函数正在执行,但没有向主题发送任何消息。
上午 7:53:04.745
新消息
函数执行开始
7:53:05.807 上午
新消息
函数执行耗时 1063 毫秒,完成状态:'ok'
您必须 returning 值,承诺值或空值。如果您需要多个承诺来解决,您可以使用 await Promise.all()
或根据您的设计使用 .allSettled()
。
同样发生的是,由于 async
没有任何等待或 return,它将在解析 .then()
之前完成,因为它是 async
这是因为仿真不是与 Cloud Functions 的一对一比较。
我的云函数在 firebase 模拟器上运行良好,尽管在部署到 firestore 后,它无法运行。尽管没有任何反应,函数仍然执行。
在引入 statusValue 的 if 语句之前,它在 firestore 中工作。虽然,即使在引入 if 语句之后,它仍然在模拟器中按预期工作。
我已经删除并重新部署了功能并安装了最新版本的节点,但没有成功。
感谢帮助!
const functions = require("firebase-functions");
const admin = require('firebase-admin');
admin.initializeApp();
// capture group members when a new message is added to a group to notify them
exports.newMessage = functions.region('australia-southeast1')
.firestore
.document('ChatRooms/{chatRoomsID}/Messages/{messageID}')
.onCreate(async (snap, context) => {
const messageData = snap.data();
const messageSender = messageData.fullName;
// access the documentRef at collection level
const chatRoomRef = snap.ref.parent.parent;
// access the data at collection level
const chatRoomSnap = await chatRoomRef.get();
const chatRoomData = chatRoomSnap.data();
const groupMembers = chatRoomData.members;
const activeUsers = chatRoomData.activeUserStatus;
const chatRoomTitle = chatRoomData.chatRoomTitle;
const notificationTitle = `ChatRoom: ${chatRoomTitle}`
const notificationBody = `${messageSender} sent a message`;
groupMembers.forEach((item, i) => {
const statusValue = activeUsers[item]
if (statusValue == 0) {
const topic = item.replace(/[^a-zA-Z0-9]/g,'-');
const message = {
notification : {
title : notificationTitle,
body: notificationBody
},
apns: {
payload: {
aps: {
sound : `default`
}
}
},
topic: topic,
};
// send notification subscribed to topic
admin.messaging().send(message).then((response) => {
console.log(`Successfully sent message to ${topic}`, response);
}).catch((error) => {
console.log('Error sending message:', error);
});
};
});
});
以上是在模拟器中运行,查看日志:
i 个函数:开始执行“australia-southeast1-newMessage”
i 功能:在 ~1s
中完成“australia-southeast1-newMessage”成功发送消息至5-3-com项目/
已成功向 3-4-com 项目发送消息/
当部署到 firestore 中时,firestore 函数中的日志显示函数正在执行,但没有向主题发送任何消息。
上午 7:53:04.745 新消息 函数执行开始
7:53:05.807 上午 新消息 函数执行耗时 1063 毫秒,完成状态:'ok'
您必须 returning 值,承诺值或空值。如果您需要多个承诺来解决,您可以使用 await Promise.all()
或根据您的设计使用 .allSettled()
。
同样发生的是,由于 async
没有任何等待或 return,它将在解析 .then()
之前完成,因为它是 async
这是因为仿真不是与 Cloud Functions 的一对一比较。