Node.js 无法在google cloud函数中查询firebase

Node.js 无法在google cloud函数中查询firebase,node.js,firebase,firebase-realtime-database,google-cloud-functions,Node.js,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个firebase云功能,我无法在google云环境中运行。我的函数在每个环境中都运行良好,包括本地模拟器,除了实际的云。它到达了我向数据库查询用户记录的那一行(下面的第9行)。它将在那里挂一会儿,然后超时。你知道为什么会这样吗?事件输入正常,并且具有正确的用户id const admin = require('firebase-admin'); const functions = require('firebase-functions'); admin.initializeApp(fu

我有一个firebase云功能,我无法在google云环境中运行。我的函数在每个环境中都运行良好,包括本地模拟器,除了实际的云。它到达了我向数据库查询用户记录的那一行(下面的第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
});
来自管理数据库连接的调试日志看起来也很好(在到达有问题的代码时立即打印,然后继续挂起,直到超时):


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

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功能回报性能承诺,并尽可能降低数据库成本。
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
});