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