【问题标题】:cloud function with fetch could not deploy correctly带有 fetch 的云功能无法正确部署
【发布时间】:2021-08-23 07:50:01
【问题描述】:

我目前正在开发一个需要与我的 Firestore 配合使用的 Firebase 云功能。我的firebase的结构如下:

chatrooms/{chatID}/{chatID}/anymessage

两个聊天 ID 相同,它们类似于一个单独的聊天室,每个聊天室里面都有任何消息。此外,每个聊天室都有一个“hello”文档,其中有我需要在云功能中使用的关键数据,因为我需要从那里提取一个密钥,以便发送推送通知。

这是我目前正在尝试部署的云功能:

exports.createpushnotification = functions.firestore.document('chatrooms/{chatID}/{chatID}/hello').onUpdate((change, context) => {
     const keyofuser1 = change.after.data().partner1pushkey; //key to use for push notification

     fetch("https://exp.host/--/api/v2/push/send", {
         method:"POST",
         headers:{
             "Accept": "application/json",
             "Content-Type": "application/json"
         },
         body:JSON.stringify({"to":keyofuser1, "body":"New Message!"})
     })
     

 })

基本上我想要一个进入每个聊天室目录的云函数,从那里获取“hello”文件并等待它更新,当它更新时,执行获取操作。不幸的是,我得到了一个错误,即使使用 --debug 我也看不到任何可以帮助我的错误日志:

Functions deploy 出现以下函数错误: createpushnotification(us-central1)

要尝试重新部署这些功能,请运行: firebase deploy --only "functions:createpushnotification"

要继续部署其他功能(例如数据库),请运行: firebase deploy --except 功能 [2021-08-23T07:33:26.669Z] 更新期间出错 项目/*********/locations/us-central1/functions/createpushnotification:

错误:函数未正确部署。

我在这里做错了什么?

【问题讨论】:

  • 你没有兑现承诺。尝试在fetch(...) 之前添加return。您还可以分享您的 Firestore 文档的屏幕截图吗? chatrooms/{chatID}/{chatID}/anymessage 为什么你有两次chatID
  • “我想要一个云函数,它进入每个聊天室目录,从那里获取“hello”文件”=>您当前的云函数不会这样做。只有当 一个 hello 文档被修改时才会触发。您能否确认您希望 Cloud Function 在执行时读取每个聊天室集合?
  • @Renaud Tarnec 是的。正如你所说,我希望它进入多个位置并收听“hello”文件。
  • @Dharmaraj 我有两次 ChatID,因为我需要以最终有文档的方式构建 Firestore。我是否只使用“一个”ChatID 我会在端点有一个集合而不是文档。
  • @KubaghettothefreshTestobun 我仍然不确定你的确切目标。您想收听任何 hello 文档发生的任何更新,还是想在一次操作中循环遍历所有 hello 文档?

标签: javascript firebase google-cloud-functions firebase-cloud-messaging


【解决方案1】:

您的问题来自您在定义云函数时两次使用了相同的通配符标识符,即chatID

更改代码使用两个不同的标识符,如下

exports.createpushnotification = functions.firestore.document('chatrooms/{chatDocID}/{chatSubcollectionID}/hello').onUpdate(..);

应该可以解决问题。


另外,由于 fetch 操作是异步的,而且由于你的 Cloud function 是后台 Cloud Function,所以你需要返回 fetch() 返回的 promise,以便向 Cloud Function 平台表明它可以终止函数.有关详细信息,请参阅doc

如下操作:

return fetch("https://exp.host/--/api/v2/push/send", {..})

【讨论】:

  • 这帮助我部署了该功能,现在我不再收到任何错误!但是,该功能似乎没有做我真正想要的。当我更改“hello”文件时,我的手机上没有收到任何通知。这很奇怪,因为我的应用程序内部的前端代码必须工作,因为当我使用expo.dev/notifications 时,它工作并在我的手机上显示通知。我的功能有问题吗?
  • 因为我可以通过网站发送通知,我很确定我的应用程序本身没有问题,它一定是云功能的东西在这里不适合我。也许我错了,我不确定。
  • 对于您当前共享的信息量,恐怕我们无法再为您提供帮助了。您需要通过添加 catch() 块来调试您的代码,并查看您在 Expo 的 Push API 端是否有错误。
  • 不用担心,它的工作原理。我犯了一个愚蠢的错误,将“partner1pushkey”保存在我的firestore文档中,开始和结束时用分号,即使它已经被声明为字符串,删除它们现在它完美了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-08-08
  • 2018-12-29
  • 1970-01-01
  • 2020-10-15
  • 2021-11-17
  • 2021-01-30
相关资源
最近更新 更多