错误:无法加载默认凭据。 -云功能

时间:2019-12-01 13:31:31

标签: firebase react-native firebase-cloud-messaging google-cloud-functions

我正在为我的react-native应用程序进行分组功能。我希望将云消息发送给创建组时已添加的用户。我正在使用云函数来做到这一点。

但是我的函数出现此错误:

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

enter image description here

它无法从Firestore提取fcm令牌来发送通知。

我已经编写了用于发送朋友请求的云功能,其中,从云Firestore成功检索了令牌,并发送了通知。

这是我的云功能:


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

//======================NOTIFY ADDED MEMBERS==========================//

exports.notifyAddedMembers = functions.https.onCall((data, context) => {
  const members = data.members;
  const groupName = data.groupName;
  var tokens = [];
  members.forEach(async member => {
    //send notifications to member.uid
    console.log('MEMBER.UID ', member.uid);
    await fetchTokenFromUid(member.uid)
      .then(token => {
        console.log('retrieved token: ', token);
        // tokens.push(token);
        const payload = {
          notification: {
            title: `You have been added to ${groupName}`,
            body: 'Share your tasks',
            sound: 'default',
          },
        };
        return admin.messaging().sendToDevice(token, payload);
      })
      .catch(err => console.log('err getting token', err));
  });
  // console.log('ALL TOKENS: ', tokens);
  console.log('GROUP NAME: ', groupName);
});

async function fetchTokenFromUid(uid) {
  var token = '';
  return await admin
    .firestore()
    .collection('Users')
    .doc(`${uid}`)
    .get()
    .then(async doc => {
      console.log('uid token: ', Object.keys(doc.data().fcmTokens));
      var tokenArray = Object.keys(doc.data().fcmTokens); //ARRAY
      for (var i = 0; i < tokenArray.length; i++) {
        token = tokenArray[i]; //Coverts array to string
      }
      return token; //return token as string
    });
}

我正在使用react-native-firebase库。

1 个答案:

答案 0 :(得分:1)

您正在正确加载firebase-functionsfirebase-admin模块,并初始化admin应用实例。

我不知道是什么导致了错误,但是基于此SO Question,可能是因为在您的Cloud Function中,您将async/await与{{ 1}}方法。

您的then()文件中是否还有其他Cloud Function?特别是一些与其他Google API交互的对象。

我建议使用Promise.all()如下重构您的代码。您首先获取所有令牌,然后发送消息。

index.js