无法让 Firebase Cloud Functions for Firestore 在我的集合的写入时触发。尝试为聊天应用程序设置设备到设备的推送通知。功能已部署并在即用即付计划中,但是,不会触发"聊天"集合中的文档、更新或创建中的更改。Firebase云消息传递应该发送推送并写入日志。两者都没有发生。推送正在与其他来源合作。
感谢您的帮助,希望设备到设备的推送通知更容易,计划是观看聊天文档并在更新或创建新对话时触发推送通知。对其他想法持开放态度。谢谢
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.sendNotification = functions.firestore
.document('chats/{chatID}')
.onWrite((data, context) => {
// Get an object representing the document
console.log('chat triggered');
// perform desired operations ...
// See documentation on defining a message payload.
var message = {
notification: {
title: 'Hello World!',
body: 'Hello World!'
},
topic: context.params.chatID
};
// Send a message to devices subscribed to the provided topic.
return admin.messaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
return true
})
.catch((error) => {
console.log('Error sending message:', error);
});
});
更新:我正在使用"火力基础函数":"^1.0.1">
更新:更新了代码以反映我们当前部署的内容,但仍然无法正常工作。
您有可能将旧语法(V1.0 之前)与新库 (v1.0) 一起使用。请参阅迁移指南:https://firebase.google.com/docs/functions/beta-v1-diff 并检查 package.json 文件中的版本。
此外,请注意,云函数必须始终返回 Promise(或者,如果不能,则至少返回异步函数的值)。请参阅此文档(和相关视频),其中详细解释了这一点:https://firebase.google.com/docs/functions/terminate-functions
您应该以这种方式修改代码:
如果您使用的是云函数 1.0 或更高版本:
exports.sendNotification = functions.firestore
.document('chats/{chatID}')
.onWrite((change, context) => {
返回:
exports.sendNotification = functions.firestore
.document('chats/{chatID}')
.onWrite((change, context) => {
// Get an object representing the document
console.log('chat triggered');
// perform desired operations ...
// See documentation on defining a message payload.
var message = {
notification: {
title: 'Hello World!',
body: 'Hello World!'
},
topic: context.params.chatID. //<- If you are using a CF version under v1.0 don't change here
};
// Send a message to devices subscribed to the provided topic.
return admin.messaging().send(message). //<- return the resulting Promise
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
return true; //<- return a value
})
.catch((error) => {
console.log('Error sending message:', error);
//return. <- No need to return here
});
});
firebase-admin
初始化语法admin.initializeApp()
表明你使用的是云函数 SDK 版本 1.0.x。onWrite()
的参数在版本 1.0.x 中与早期版本相比已更改。 您还需要返回异步操作admin.messaging.send()
的Promise
。 下面指出了三个需要更正的地方:
exports.sendNotification = functions.firestore
.document('chats/{chatID}')
.onWrite((data, context) => { // <= CHANGE
// Get an object representing the document
console.log('chat triggered');
// perform desired operations ...
// See documentation on defining a message payload.
var message = {
notification: {
title: 'Hello World!',
body: 'Hello World!'
},
topic: context.params.chatID // <= CHANGE
};
// Send a message to devices subscribed to the provided topic.
return admin.messaging().send(message) // <= CHANGE
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
return
})
.catch((error) => {
console.log('Error sending message:', error);
return
});
});
对我来说,问题是我正在写入Firestore中已经存在的数据。如果您正在写入的数据与那里的数据完全相同,则显然不会触发 onWrite。