javascript - 你能发现这个 node.js 函数中的内存泄漏吗?
问题描述
我部署的应用程序有一个函数,可以在调用app.get("/")
路由时调用数据库,或者当用户向数据库添加或删除文件时。调用此函数时,我的 Web 主机限制了我的服务,因为它超出了我的内存分配,导致我的一个 npm 包(尖锐)出现故障,没有可用于处理图像的处理器线程。
我研究了我的网络主机提供的指标,但除了告诉我发生了故障外,它并没有显示内存使用量有多大或在哪里。使用 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()
再次调用该函数以重新填充数组。
我没有注意到性能有任何下降,如果不是因为我的网络主机限制了我的内存,我永远不会知道有泄漏。请给我指导,希望不要过多地涉及术语,但是像我这样的新开发人员可以理解的术语。
解决方案
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)
});
}
推荐阅读
- c - 完美数字:为什么嵌套的 if 不起作用?
- javascript - 更新事件后的传单 svg
- javascript - FullCalendar 未在 Boostrap 4 选项卡中加载
- postgresql - 哈希连接导致没有剩余空间错误
- python - 如何在 OSMnx 中去除边缘
- c# - 使用 c# 从 excel 工作表中连续获取基于先前单元格值的其他单元格值
- wordpress - asc 和 desc 在 WP_Query 中的自定义 tax_query 中不起作用
- javascript - 对于按类查找 jQuery 的函数
- python - Numpy 数组共享内存,即使所有测试都是错误的????这是一个错误吗?
- css - 一个或两个孩子的 CSS 样式不同