为Firebase创建函数时,如何解决“函数返回了未定义,期望的承诺或值”的问题?

时间:2019-06-07 21:50:01

标签: javascript firebase google-cloud-functions

我创建了一个Firebase函数来触发推送通知,但是我在Firebase上获得了以下寄存器,“函数返回了未定义的,预期的承诺或值”和“ 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)

3 个答案:

答案 0 :(得分:1)

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

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

现在,您的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,以防没有快照,否则您将不会返回任何内容。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为卡尼兹先生已经解决了他的问题。但是由于没有人回答他问题的后半部分,所以我可能有一个可能的解决方案。更改以下代码段:

(var token of snapshot.docs)

收件人:

(var token of snapshots.docs)

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