Javascript Firebase功能“;错误:超出内存限制。函数调用被中断;

Javascript Firebase功能“;错误:超出内存限制。函数调用被中断;,javascript,firebase,firebase-realtime-database,request,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Request,Google Cloud Functions,是否有人在firebase函数中遇到了以下错误(并且非常确定它甚至不应该出现在错误附近) 错误:超出内存限制。函数调用被中断 功能 具体来说,它是一个三周一次的基于CRON的函数,可以调用30个Feedly API来检索100篇文章的元数据(包括摘要/内容信息)。从Firebase数据库中提取和推送到Firebase数据库的数据量的粗略计算告诉我,它不应该接近规定限制的一半。在使用“firebase函数:shell”进行本地测试时,它也对我有用 以下是代码的最低版本(原始代码约130行): co

是否有人在firebase函数中遇到了以下错误(并且非常确定它甚至不应该出现在错误附近)

错误:超出内存限制。函数调用被中断

功能

具体来说,它是一个三周一次的基于CRON的函数,可以调用30个Feedly API来检索100篇文章的元数据(包括摘要/内容信息)。从Firebase数据库中提取和推送到Firebase数据库的数据量的粗略计算告诉我,它不应该接近规定限制的一半。在使用“firebase函数:shell”进行本地测试时,它也对我有用

以下是代码的最低版本(原始代码约130行):

const rp=require('request-promise');
var exports=module.exports={};
exports.feedlyPull_A=functions.pubsub.topic('triweekly-tick').onPublish((事件)=>{
设ps=[];
用于(feedlyList中的var catKey){
if(feedlyList.hasOwnProperty(catKey)){
让读取匹配详细信息={
uri:'http://cloud.feedly.com/v3/streams/contents?streamId=user%2FUSER_KEY_HERE%2Fcategory%2F“+feedlyList[catKey].key+”&count=100',
方法:“GET”\
标题:{
“授权”:“此处为OAUTH密钥”
},
json:true
};
ps.push(rp(读取匹配详细信息));
}
}
让artPromise=admin.database().ref('Article')。一次('value');
返回艺术承诺。然后(结果\u艺术=>{
让articleObj=结果_art.val();
让skillPromise=admin.database().ref('Skill')。once('value');
返回skillPromise.then(results\u ski=>{
console.log('Skills Retrieved!');
让skillList=results_ski.val();
返回承诺。全部(ps)
。然后((结果)=>{
对于(var i=0;i0){
for(文章中的var键){
//这里对文章摘要/内容进行了一系列关键字解析,并存储在数组中
}
if(艺术列表){
admin.database().ref('Article/'+路径名).set(艺术列表,(快照)=>{
console.log('Processed&push:'+路径名);
});
}
}否则{
console.log('失败(未找到文章):'+路径名);
}
}
}).catch(错误=>{
控制台日志(err);
});
});
});
});
我对云计算非常陌生,所以我有点迷茫从哪里开始。。。有没有人能够解决/调试这样的问题,或者有什么建议

我在想,如果有一种方法能够以某种方式测量累积内存(考虑到我理解256MB指的是什么),我将能够基于如何解决问题的尝试和错误来回溯,但不知道如何做到这一点

非常感谢你!
(这已经推迟了启动计划一段时间,因此非常感谢您的帮助!)

我不知道这是否是内存限制错误的根源,但您应该如下调整代码,以便在云功能中返回承诺

请注意,
artList
的值是多少尚不清楚。它可能是在为提高可读性而删除的代码部分中定义的

const rp = require('request-promise');

var exports = module.exports = {};

exports.feedlyPull_A = functions.pubsub.topic('triweekly-tick').onPublish((event) => {
  let ps = [];
  for (var catKey in feedlyList) {
    if (feedlyList.hasOwnProperty(catKey)) {

      let read_match_details = {
        uri: 'http://cloud.feedly.com/v3/streams/contents?streamId=user%2FUSER_KEY_HERE%2Fcategory%2F' + feedlyList[catKey].key + '&count=100',
        method: 'GET',\
        headers : {
          "Authorization" : "OAUTH KEY HERE"
        },
        json: true
      };
      ps.push(rp(read_match_details));
    }
  }

  let artPromise = admin.database().ref('Article').once('value');

  return artPromise.then(results_art => {
    let articleObj = results_art.val();

    let skillPromise = admin.database().ref('Skill').once('value');

    return skillPromise.then(results_ski => {
      console.log('Skills Retrieved!');
      let skillList = results_ski.val();

      return Promise.all(ps)
      .then((results) => {

        let promises = []; 

        for (var i = 0; i < results.length; i++) {
          let articles = results[i].items;

          let pathName = feedlyList[i].name;

          if (articles && Object.keys(articles).length > 0) {
            for (var key in articles) {
              // A BUNCH OF KEYWORD PARSING ON ARTICLE SUMMARY/CONTENT HERE and storing in arrays
            }

            if (artList) {
               promises.push(admin.database().ref('Article/'+pathName).set(artList));
            } else {
              console.log('Failed (No articles found): ' + pathName);
            }
          }
        }

        return Promise.all(promises);

      }).catch(err => {

        console.log(err);
        return false;   //Important, see the videos I mention below

      });
    });
  });
});
const rp=require('request-promise');
var exports=module.exports={};
exports.feedlyPull_A=functions.pubsub.topic('triweekly-tick').onPublish((事件)=>{
设ps=[];
用于(feedlyList中的var catKey){
if(feedlyList.hasOwnProperty(catKey)){
让读取匹配详细信息={
uri:'http://cloud.feedly.com/v3/streams/contents?streamId=user%2FUSER_KEY_HERE%2Fcategory%2F“+feedlyList[catKey].key+”&count=100',
方法:“GET”\
标题:{
“授权”:“此处为OAUTH密钥”
},
json:true
};
ps.push(rp(读取匹配详细信息));
}
}
让artPromise=admin.database().ref('Article')。一次('value');
返回艺术承诺。然后(结果\u艺术=>{
让articleObj=结果_art.val();
让skillPromise=admin.database().ref('Skill')。once('value');
返回skillPromise.then(results\u ski=>{
console.log('Skills Retrieved!');
让skillList=results_ski.val();
返回承诺。全部(ps)
。然后((结果)=>{
让承诺=[];
对于(var i=0;i0){
for(文章中的var键){
//这里对文章摘要/内容进行了一系列关键字解析,并存储在数组中
}
if(艺术列表){
promises.push(admin.database().ref('Article/'+pathName).set(artList));
}否则{
console.log('失败(未找到文章):'+路径名);
}
}
}
返回承诺。全部(承诺);
}).catch(错误=>{
控制台日志(err);
return false;//重要的是,请参阅我在下面提到的视频
});
});
});
});

我还建议您看看Firebase团队的这两个必看视频,关于云功能和承诺:以及

Thx@renaud tarnec!这些视频也非常有用。提出了您的建议修复(完全有意义!),但我也想知道是否可以将.then放在Promise.all之后,而不是它的父承诺(
return SkillPromise.then(…
),如第3页所示?我仍然面临与错误相关的问题,这让我认为可能是它。。。
const rp = require('request-promise');

var exports = module.exports = {};

exports.feedlyPull_A = functions.pubsub.topic('triweekly-tick').onPublish((event) => {
  let ps = [];
  for (var catKey in feedlyList) {
    if (feedlyList.hasOwnProperty(catKey)) {

      let read_match_details = {
        uri: 'http://cloud.feedly.com/v3/streams/contents?streamId=user%2FUSER_KEY_HERE%2Fcategory%2F' + feedlyList[catKey].key + '&count=100',
        method: 'GET',\
        headers : {
          "Authorization" : "OAUTH KEY HERE"
        },
        json: true
      };
      ps.push(rp(read_match_details));
    }
  }

  let artPromise = admin.database().ref('Article').once('value');

  return artPromise.then(results_art => {
    let articleObj = results_art.val();

    let skillPromise = admin.database().ref('Skill').once('value');

    return skillPromise.then(results_ski => {
      console.log('Skills Retrieved!');
      let skillList = results_ski.val();

      return Promise.all(ps)
      .then((results) => {

        let promises = []; 

        for (var i = 0; i < results.length; i++) {
          let articles = results[i].items;

          let pathName = feedlyList[i].name;

          if (articles && Object.keys(articles).length > 0) {
            for (var key in articles) {
              // A BUNCH OF KEYWORD PARSING ON ARTICLE SUMMARY/CONTENT HERE and storing in arrays
            }

            if (artList) {
               promises.push(admin.database().ref('Article/'+pathName).set(artList));
            } else {
              console.log('Failed (No articles found): ' + pathName);
            }
          }
        }

        return Promise.all(promises);

      }).catch(err => {

        console.log(err);
        return false;   //Important, see the videos I mention below

      });
    });
  });
});