NodeJS:JavaScript 堆内存不足

问题描述 投票:0回答:1

在我的 Node.js 应用程序中,有一个函数会导致应用程序崩溃并出现错误:

Reached heap limit Allocation failed - JavaScript heap out of memory
。我怀疑这可能与同时执行大量异步操作有关,这可能会导致内存耗尽。

但是,我不知道如何解决它。也许有人有一些想法?

async updateLinks() {
  const medias = await this.mediaModel.find()
  this.logger.log('Cron Job: Updating Urls .....')
  for(let media of medias) {
    const url = await this.testService.getPreSignedUrl(media.key)
    media.url = url
    media.save()
  }
  this.logger.log('Cron Job: Completed ')
}
async getPreSignedUrl(key: string): Promise<string> {
  try {
    const data = await this.s3.getSignedUrl('getObject', {
      Key: key,
      Bucket: process.env.BUCKET_ID,
      Expires: 600000 // almost a week
    });
    return data;
  } catch (err) {
    this.logger.error(err);
    return null;
  }
}
node.js mongodb asynchronous nestjs heap-memory
1个回答
0
投票

为了防止所有操作并行运行,请在

await
前面添加
media.save()
,如下所示:

async updateLinks() {
  const medias = await this.mediaModel.find()
  this.logger.log('Cron Job: Updating Urls .....')
  for(let media of medias) {
    const url = await this.testService.getPreSignedUrl(media.key)
    media.url = url
    await media.save()
  }
  this.logger.log('Cron Job: Completed ')
}

如果没有

await
updateLinks()
在保存完成之前返回,因此您会同时进行大量
save()
操作,这可能(如果
for
循环很大)会压垮某种资源。相反,使用
await
,操作将一次按顺序进行。

如果您多次或循环调用

updateLinks()
,您还希望在该调用中获得
await

© www.soinside.com 2019 - 2024. All rights reserved.