问题描述
我部署的应用程序具有一项功能,该功能可在调用app.get("/")
路由或用户向数据库中添加或删除文件时调用数据库。调用此函数时,我的服务受到Web主机的限制,因为它超出了我的内存分配,导致我的npm软件包(锋利)之一失败,没有处理器线程可用于处理图像。
我已经研究了Web主机提供的指标,但是除了告诉我发生了故障之外,它没有显示内存使用量或位置。使用Chrome DevTools任务管理器,我可以看到实时javascript内存实际上在应用程序的运行期间确实获得了缓慢的增长,但没有超过我浏览过的其他网页。
我在该领域没有任何指导者,在对内存泄漏进行了详尽的研究之后,是什么原因导致了它们,以及如何对它们进行故障排除,我迷失了方向,感到困惑,但是我相信我已经将其范围缩小到了问题的元凶。我只是不知道该怎么办。
这是有问题的功能
let artWorks = [];
async function listFiles() {
artWorks = []; //clears the array if it has content
const [files] = await storage.bucket(bucketName).getFiles(); //call for url names of files in DB
files.forEach(file => { //loops through all files and pushes them to the array,separating the URL string into usable data
function splitStr(str) {
var string = str.split("/");
artWorks.push(
{
imgCategory: string[0],subCat: string[1].replace(/-/g,' '),imgSrc: bucket + file.name,thumbnail: thumbBucket + file.name.split('.')[0] + "-thumb.jpg",alt: string[2]
});
}
var str = file.name;
splitStr(str);
});
console.log("files listed");
}
artWorks
数组是整个应用程序的症结所在。每条路线都使用此数组的内容来填充ejs模板页面。用户添加或删除文件后,将再次调用listFiles()
函数以重新填充数组。
我没有注意到性能有任何下降,如果不是因为我的Web主机限制了我的内存,我绝对不会知道有泄漏。请为我提供指导,希望不要过多地使用术语,但是在术语上像我这样的新开发人员可以理解。
解决方法
请注意,您在每次迭代中都声明了splitStr
函数。
我为您提供了一个小建议,以使您可以更轻松地阅读此代码段。
希望您会喜欢。
const filesMapper = ({name}) => {
const string = name.split('/')
return {
imgCategory: string[0],subCat: string[1].replace(/-/g,' '),imgSrc: bucket + name,thumbnail: thumbBucket + name.split('.')[0] + "-thumb.jpg",alt: string[2]
}
}
async function listFiles() {
const [files] = await storage.bucket(bucketName).getFiles();
return files.map(filesMapper)
});
}