您可以在此node.js函数中发现内存泄漏吗?

问题描述

我部署的应用程序具有一项功能,该功能可在调用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)
  });
}