简体   繁体   English

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

[英]Error: Could not load the default credentials. - Cloud Functions

I'm working on the group functionality for my react-native app.我正在为我的 react-native 应用开发群组功能。 And I wish to send cloud messages to users who have been added when a group is created.并且我希望向创建组时添加的用户发送云消息。 I'm using cloud functions to do that.我正在使用云功能来做到这一点。

But I am getting this error in my function:但是我在我的函数中遇到了这个错误:

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)

在此处输入图像描述

Its unable to fetch the fcm-token from firestore to send the notification.它无法从 firestore 获取 fcm-token 来发送通知。

I had written cloud functions for sending friend requests and in that, the token is retrieved successfully from cloud firestore, and the notification is sent.我已经编写了用于发送好友请求的云函数,并且在其中,从云 firestore 成功检索了令牌,并发送了通知。

This is my cloud function:这是我的云功能:


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
    });
}

I am using the react-native-firebase library.我正在使用 react-native-firebase 库。

You are correctly loading the firebase-functions and firebase-admin modules, and initializing an admin app instance.您正在正确加载firebase-functionsfirebase-admin模块,并初始化admin应用程序实例。

I don't know what exactly generates the error you got, but based on this SO Question it could be because, in your Cloud Function, you are mixing the use of async/await with the then() method.我不知道究竟是什么导致了你得到的错误,但基于这个SO 问题,这可能是因为在你的 Cloud Function 中,你将async/await的使用与then()方法混合使用。

Do you have any other Cloud Function(s) in your index.js file?您的index.js文件中是否还有其他 Cloud Function? In particular some that interact with other Google APIs.特别是一些与其他 Google API 交互的 API。

I propose to refactor your code as follows, using Promise.all() .我建议使用Promise.all()如下重构您的代码。 You first fetch all the tokens and then you send the messages.您首先获取所有令牌,然后发送消息。

exports.notifyAddedMembers = functions.https.onCall(async (data, context) => {

    try {
        const members = data.members;
        const groupName = data.groupName;

        const promises = [];
        members.forEach(member => {
            promises.push(admin
                .firestore()
                .collection('Users')
                .doc(member.uid).get());
        });

        const tokensSnapshotsArray = await Promise.all(promises);

        const promises1 = [];
        tokensSnapshotsArray.forEach(snap => {

            const token = snap.data().fcmToken;  //Here you may adapt as it seems you have an array of tokens. I let you write the loop, etc.

            const payload = {
                notification: {
                    title: `You have been added to ${groupName}`,
                    body: 'Share your tasks',
                    sound: 'default',
                },
            };
            promises1.push(admin.messaging().sendToDevice(token, payload));

        });

        await Promise.all(promises1);

        return { result: 'OK' }
    } catch (error) {
        //See the doc: https://firebase.google.com/docs/functions/callable#handle_errors
    }

});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 错误:无法加载默认凭据(Firebase function 到 firestore) - Error: Could not load the default credentials (Firebase function to firestore) GCP App Engine - 无法加载默认凭据 - GCP App Engine - Could not load the default credentials 无法获取应用程序默认凭据。 在本地运行 - Unable to get application default credentials. run on locally Google Cloud Functions Firebase 错误 默认的 Firebase 应用已经存在 - Google Cloud Functions Firebase Error The default Firebase app already exists 用于本地开发的 Google Cloud Functions 凭据 - Google Cloud Functions Credentials for Local Development Cloud Functions 部署错误对话框流 - Cloud Functions Deployment error dialogflow 无法访问 Cloud Firestore 后端错误 - Could not reach Cloud Firestore backend error Firebase 云函数捕获/处理错误 - Firebase cloud functions catch/handle error Firebase 云函数部署错误 - 超出配额 - Firebase Cloud Functions Deploy Error - Quota Exceeded 部署 Cloud FireStore 云功能时出现身份验证错误 - Auth error when deploying Cloud FireStore cloud functions
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM