【问题标题】:Unable to query firebase in google cloud function无法在谷歌云功能中查询 Firebase
【发布时间】:2018-01-18 09:38:35
【问题描述】:

我有一个无法在谷歌云环境中运行的 firebase 云功能。我的功能在每个环境中都运行良好,包括本地模拟器,除了实际的云。它到达了我向数据库查询用户记录的行(下面的第 9 行)。它会挂在那里一段时间,然后超时。关于为什么会发生这种情况的任何想法?事件输入很好,并且具有正确的用户 ID。

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

admin.initializeApp(functions.config().firebase);
admin.database.enableLogging(true);

exports.createContract = functions.database.ref('/messages/{messageId}').onCreate(event => {
  let data = event.data.val();
  admin.database().ref(`/users/${data.user.id}`).once('value').then(user => {
    if (user.val() === null) {
      return reject(`User ${data.user.id} does not exist`);
    } else {
      data.userData.push(user.val());
    }
  }).catch((error) => {
      console.log(error);
  });
  // do other stuff here
});

来自管理数据库连接的调试日志看起来也很好(一旦到达有问题的代码就会打印出来,然后继续挂起直到超时):

p:0: Browser went online.
p:0: Listen called for /users/-idabc123 default  
p:0: Making a connection attempt  
p:0: Auth token refreshed  
getToken() completed. Creating connection.  
c:0:0: Connection created  
c:0:0:0 Websocket connecting to wss://xxxxxx.firebaseio.com/.ws?v=5  
c:0:0:0 Websocket connected.  
c:0:0: Realtime connection established.  
p:0: connection ready  
p:0: reportStats {"c":{"sdk.node.4-8-2":1}}  
p:0: {"r":1,"a":"s","b":{"c":{"sdk.node.4-8-2":1}}}  
p:0: {"r":2,"a":"gauth","b":{"cred":"xxxxxxxxx"}}  
p:0: Listen on /users/-idabc123 for default  
p:0: {"r":3,"a":"q","b":{"p":"/users/-idabc123","h":""}}  
p:0: from server: {"r":1,"b":{"s":"ok","d":""}}  
c:0:0: Primary connection is healthy.  

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    您需要向 Google Cloud 函数返回一个 Promise,让它知道您在 .push 中请求的异步工作已经完成或您拒绝了一个 Promise。 Google Cloud 正在等待承诺并超时。

    exports.createContract = functions.database.ref('/messages/{messageId}').onCreate(event => {
      let data = event.data.val();
      // ADD RETURN BELOW
      return admin.database().ref(`/users/${data.user.id}`).once('value').then(user => { 
        if (user.val() === null) {
          //ADD 'PROMISE.'
          return Promise.reject(`User ${data.user.id} does not exist`)
        } else {
          return data.userData.push(user.val()); // AND ADD RETURN HERE
        }
      }).catch((error) => {
          console.log(error);
      });
      // do other stuff here
    });
    

    【讨论】:

    • 原来我的依赖项之一在我的云功能中造成了奇怪的影响。如果您在云功能中遇到无法解释的行为,请查看您的依赖项。
    • 您仍应将承诺返回给 Firebase 函数以提高性能并尽可能降低数据库成本。
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2021-02-26
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2021-07-04
    相关资源
    最近更新 更多