Google云端功能:警告避免嵌套诺言诺言/不嵌套+ 5k寄存器

时间:2018-09-28 11:47:40

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

我的Firebase应用程序具有以下功能。

但是每次我部署它时,都会收到此消息:

  

142:12警告避免嵌套promises promise / no-nesting

     

✖1个问题(0个错误,1个警告)

exports.cronTravas = functions.database.ref('acoes').onUpdate((change, context) => {
      const acoes = change.after.val();
      var acoesNovas = [];
  var travas = {}

  for (var key in acoes) {
    var item = {
      'key': key,
      'ult': acoes[key].ult
    }
    acoesNovas[key.substring(0, 4)] = item;
  }

  return admin.database().ref().child('opcoesNew').orderByChild('strike').once('value')
  .then((snap) => {
    const opcoes = snap.val();

    travas['travasAlta'] = {}
    for (var data in opcoes) {
      travas['travasAlta'][data] = {}
      for (var ativo in opcoes[data]) {
        travas['travasAlta'][data][ativo] = {}

        var i = 0;
        for (var opcao in opcoes[data][ativo]) {
          i++;
          travas['travasAlta'][data][ativo] = calculaTravas(opcoes[data][ativo], acoesNovas[ativo].ult);
        }
      }
    }
    return travas;
  })
  .then(travas => {
    return admin.database().ref().update(travas).catch((error) => {
      return console.error(error);
    });
  })
});

也就是说,如何删除此警告?

而且,如果有关系,此功能会在几分钟内消耗大量配额来生成此消息:

  

错误:超出配额(函数调用中的CPU分配:每个   天,函数调用中的CPU分配:每天);增加   配额,请在xxxxxxx的项目中启用结算功能。功能不能是   被执行。

是否有一种优化它的方法,以便我可以使用此免费配额而不会浪费它? (我知道我可以升级,但我现在真的在尝试免费计划)。

我的数据库如下:

acoes (8)
opcoes
-datas(4)
--acao(8)
---opcao(160)

因此,在我的“ opcoes”节点内,我有4个“数据”节点,每个节点都有8个“ acao”节点,每个节点都有“ 160”个opcao节点。因此,我至少有5k个节点,并且每次“ acoes”节点更新时(每分钟1x),我都必须遍历所有这些节点。关于如何改善它的任何想法?

1 个答案:

答案 0 :(得分:0)

应该通过对代码进行以下修改来解决第一个警告:

exports.cronTravas = functions.database.ref('acoes').onUpdate((change, context) => {
  const acoes = change.after.val();
  var acoesNovas = [];
  var travas = {}

  for (var key in acoes) {
    var item = {
      'key': key,
      'ult': acoes[key].ult
    }
    acoesNovas[key.substring(0, 4)] = item;
  }

  return admin.database().ref().child('opcoesNew').orderByChild('strike').once('value')
  .then((snap) => {
    const opcoes = snap.val();

    travas['travasAlta'] = {}
    for (var data in opcoes) {
      travas['travasAlta'][data] = {}
      for (var ativo in opcoes[data]) {
        travas['travasAlta'][data][ativo] = {}

        var i = 0;
        for (var opcao in opcoes[data][ativo]) {
          i++;
          travas['travasAlta'][data][ativo] = calculaTravas(opcoes[data][ativo], acoesNovas[ativo].ult);
        }
      }
    }
    // return travas;  <- Don't return travas here, as it is not a promise.
    // but return the promise returned by the update() method
    return admin.database().ref().update(travas);
  })
});

对于“超出配额”警报,此SO可能会给您一些指示:Function killed. Error: quota exceeded。请注意,使用您的初始代码,Cloud Function无法正确终止。