【问题标题】:How to fix "Function returned undefined, expected Promise or value" when creating a function for Firebase?为 Firebase 创建函数时如何修复“函数返回未定义、预期的承诺或值”?
【发布时间】:2019-06-07 21:50:01
【问题描述】:

我创建了一个 Firebase 函数来触发推送通知,但我在 Firebase 上获得了以下寄存器,“函数返回未定义、预期的 Promise 或值”和“snapshot.docs 在 admin.firestore.collection.get.then 中不可迭代(/srv/index.js:20:38)"。你们有什么解决办法吗?

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

var msgData;


exports.destaquesTrigger = functions.firestore.document(
'destaques/{destaquesId}'
).onCreate((snapshot, context) => {
msgData = snapshot.data();

admin.firestore().collection('pushtokens').get().then((snapshots) => 
{
   var tokens = [];
   if (snapshots.empty) {
        console.log('No Devices');

     } else {
      for (var token of snapshot.docs) {
          tokens.push(token.data().devtoken);
      }

      var payload = {
         "notification": {
             "title": msgData.notif1,
             "body": msgData.notif2,
             "sound": "default"
          },
          "data": {
             "sendername": msgData.notif3,
             "message": msgData.notif4,
         }
       }

       return admin.messaging().sendToDevice(tokens, 
 payload).then((response) => {
          console.log('Pushed them all');
       }).catch((err) => {
           console.log(err);
       })
      }

    })
  })

错误:

6:22:54.175 PM destaquesTrigger Function execution started
6:22:54.175 PM destaquesTrigger Billing account not configured. 
External network is not accessible and quotas are severely 
limited. Configure billing account to remove these restrictions
6:22:54.676 PM destaquesTrigger Function returned undefined, 
expected Promise or value
6:22:57.168 PM destaquesTrigger Function execution took 2993 ms, 
finished with status: 'ok'
6:23:23.652 PM destaquesTrigger Unhandled rejection
6:23:23.752 PM destaquesTrigger TypeError: snapshot.docs is not 
iterable at admin.firestore.collection.get.then
(/srv/index.js:20:38) at <anonymous> at 
process._tickDomainCallback (internal/process/next_tick.js:229:7)

【问题讨论】:

    标签: javascript firebase google-cloud-functions


    【解决方案1】:

    您没有从顶级函数定义中返回任何值。这意味着 Google Cloud Functions 环境无法知道您的功能何时完成,因此无法知道何时停止对您的使用收费。

    为确保 Cloud Functions 知道您的代码何时完成,您需要从顶级函数返回一个值(在所有工作同步发生的情况下),或者从顶级函数返回一个承诺 (如果在函数关闭} 后某些工作仍在继续)。

    现在您的 Cloud Function 中的顶级代码没有返回任何内容,这意味着调用此函数的结果是 undefined。这就是 Cloud Functions 环境所抱怨的。

    在您的情况下,您正在从 Firestore 加载数据,这是一个异步操作,因此您需要返回一个 Promise:

    exports.destaquesTrigger = functions.firestore.document('destaques/{destaquesId}').onCreate((snapshot, context) => {
    msgData = snapshot.data();
    
    return admin.firestore().collection('pushtokens').get().then((snapshots) => 
    {
       var tokens = [];
       if (snapshots.empty) {
            console.log('No Devices');
            return false;
         } else {
          for (var token of snapshot.docs) {
              tokens.push(token.data().devtoken);
          }
    
          var payload = {
             "notification": {
                 "title": msgData.notif1,
                 "body": msgData.notif2,
                 "sound": "default"
              },
              "data": {
                 "sendername": msgData.notif3,
                 "message": msgData.notif4,
             }
           }
    
           return admin.messaging().sendToDevice(tokens, 
     payload).then((response) => {
              console.log('Pushed them all');
           }).catch((err) => {
               console.log(err);
           })
          }
    
        })
      })
    

    我所做的更改:

    • 添加了对return admin.firestore().collection('pushtokens').get() 的返回。这是必需的,以便您的 return admin.messaging().sendToDevice( 可以“冒泡”以返回到 Cloud Functions。

    • 添加了return false,以防没有快照,否则您将不会返回任何内容。

    【讨论】:

    • 感谢您的帮助,弗兰克!它起作用了,它停止了“函数返回未定义,预期的承诺或值”,但它仍然显示“TypeError:snapshot.docs is not iterable at admin.firestore.collection.get.then (/srv/index.js:21: 38) 在 在 process._tickDomainCallback (internal/process/next_tick.js:229:7)"。
    【解决方案2】:

    我假设 Kanitz 先生已经解决了他的问题。但由于没有人回答他问题的后半部分,我可能有一个可能的解决方案。更改以下sn -p:

    (var token of snapshot.docs)
    

    到:

    (var token of snapshots.docs)
    

    我认为您使用了错误的变量来获取文档!希望对遵循 Raja Yogan 的 FCM 教程的其他人有所帮助!

    【讨论】:

    • 谢谢帕夫潘达先生,我已经失去了做这件事的希望,但你不知道你今天是如何帮助我的。非常感谢!
    【解决方案3】:

    if (snapshots.empty) 下的分支未返回定义的值。错误消息表明它希望您返回一个 Promise 值。尝试在该分支中返回 Promise.resolve()。

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 2020-12-23
      • 2018-06-17
      • 2019-05-11
      • 2019-10-28
      • 2018-12-05
      • 2018-09-03
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多