从PubSub触发的云功能写入firebase数据库

时间:2017-09-28 16:20:23

标签: javascript firebase firebase-realtime-database google-cloud-functions

我尝试使用每日触发器来更改Firebase数据库中的信息。我有许多其他正常工作的云功能,但我似乎无法使用此功能来更改数据库。

const admin = require('firebase-admin');
exports.daily_job = functions.pubsub.topic('daily-tick').onPublish((event) => {
  console.log("This job is run every day!");
  const databaseRef = admin.database().ref('/accountActions/dailyDeletion');
  databaseRef.child('delete').set("Data has been deleted!");
  return "End of database clearing";
});

这是我正在测试的代码,看看触发器是否正常工作。在我的控制台中,它显示函数启动,控制台语句被记录,执行在40-90ms完成。但我的数据库永远不会改变。删除语句永远不会出现。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

The documentation解释了执行异步处理的函数必须返回JavaScript Promise

  

通过返回a来解析执行异步处理的函数   JavaScript承诺

将您的代码更改为:

exports.daily_job = functions.pubsub.topic('daily-tick').onPublish((event) => {
  console.log("This job is run every day!");
  const databaseRef = admin.database().ref('/accountActions/dailyDeletion');
  return databaseRef.child('delete').set("Data has been deleted!").then(() => {
    console.log('End of database clearing');
  }).catch(error => {
    console.error('Database clearing failed: ', error);
  });
});

答案 1 :(得分:0)

在exports.daily_job ..

之前的某处插入此命令
admin.initializeApp(functions.config().firebase);

答案 2 :(得分:0)

我找到了问题的答案。我根据Firebase关于推送通知的文档初始化了应用程序:

admin.initializeApp({


  credential: admin.credential.cert({
    projectId: {projectId},
    clientEmail: {email},
    privateKey: {private key}
  }),
 databaseURL: {databaseURL}
 });

但由于某种原因,这引起了问题。我用一个简单的

将其切换出来
admin.initializeApp(functions.config().firebase);

这似乎解决了问题,推送通知仍然有效。