Firebase 函数不返回数据

Posted

技术标签:

【中文标题】Firebase 函数不返回数据【英文标题】:Firebase function not returning data 【发布时间】:2020-12-07 03:15:08 【问题描述】:

我正在尝试从我的 Firebase 函数中获取数据,但它一直返回空响应。看起来我需要返回一个承诺并在该承诺中返回我的数据,但即使我认为我正在这样做,我似乎也无法让它工作。我对 Node.JS 不是最熟悉,所以我可能会在 promise 中返回错误的内容。

这是我的功能代码:

exports.tasksLists = functions.region('us-east1').https.onCall((data) => 
  const userDoc = db.collection('users').doc(data.text);
  return userDoc.get().then((doc) => 
    if (!doc.exists) 
      return "";
     else 
      return doc.data().tasksKey;
    
  ).then((tasksCreds) => 
    const oauth2Client = new google.auth.OAuth2(
      '444701140384-srcttdrg28geg598h65dkekad47u9a48.apps.googleusercontent.com',
      'wNL4ZrBGYOnXUMvEcE7Z_Smo',
      'https://collag-oauth-u5b2i5chyq-ue.a.run.app/clas-s-roomcallback'
    );
    oauth2Client.setCredentials(
      refresh_token: tasksCreds.refresh_token,
      access_token: tasksCreds.token
    );
    const service = google.tasks( version: 'v1', auth: oauth2Client );
    return service.tasklists.list(, (err, res) => 
      if (err) 
        functions.logger.error(new Error(err));
        return JSON.stringify(err);
      
      const lists = res.data.items;
      if (lists) 
        functions.logger.info(lists);
        return lists;
       else 
        functions.logger.info('no lists');
        return "No lists";
      
    );
  )
    .catch((e) => 
      functions.logger.error(new Error(e));
      return JSON.stringify(e);
    );;

);

我也尝试将 OAuth 和 API 请求放在 else 下的第一个 .then() 中,但这也不起作用。

这是我调用函数和处理数据的前端代码:

let tasksLists = fireApp.functions('us-east1').httpsCallable('tasksLists');
          tasksLists( text: currentUser.uid ).then(function (result) 
            if (!result.data) 
              console.log('no data');
            
            let lists = result.data;
            console.log(lists);
          );

console.log(lists) 只是输出 null。

【问题讨论】:

【参考方案1】:

问题是您没有返回承诺。您可以使用 Promise 构造函数,传入 resolve/reject 参数并在您想要返回异步结果时调用其中的任何一个。像这样更改您的云功能:

exports.tasksLists = functions.region('us-east1').https.onCall((data) => 
  const userDoc = db.collection('users').doc(data.text);
  return new Promise((resolve, reject) => 
    userDoc.get().then((doc) => 
    if (!doc.exists) 
      return "";
     else 
      return doc.data().tasksKey;
    
  ).then((tasksCreds) => 
    const oauth2Client = new google.auth.OAuth2(
      '444701140384-srcttdrg28geg598h65dkekad47u9a48.apps.googleusercontent.com',
      'wNL4ZrBGYOnXUMvEcE7Z_Smo',
      'https://collag-oauth-u5b2i5chyq-ue.a.run.app/clas-s-roomcallback'
    );
    oauth2Client.setCredentials(
      refresh_token: tasksCreds.refresh_token,
      access_token: tasksCreds.token
    );
    const service = google.tasks( version: 'v1', auth: oauth2Client );
    service.tasklists.list(, (err, res) => 
      if (err) 
        functions.logger.error(new Error(err));
        // return JSON.stringify(err);
        reject(err);
      
      const lists = res.data.items;
      if (lists) 
        functions.logger.info(lists);
        resolve(lists);
        // return lists;
       else 
        functions.logger.info('no lists');
        resolve("No lists")
        // return "No lists";
      
    );
  )
    .catch((e) => 
      functions.logger.error(new Error(e));
      reject(e);
      // return JSON.stringify(e);
    );
  )
);

【讨论】:

成功了,谢谢!我以为我已经用userDoc.get() 回复了一个承诺,但我猜不是。

以上是关于Firebase 函数不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

将数据从firebase函数返回到android [重复]

从 Firebase 函数返回数据到 Android [重复]

将 Firebase 数据库数组返回到另一个函数但返回空

Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native

从 firebase 可调用函数接收返回的数据

将数据从 firebase 函数返回到应用程序