在我的 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;
}
}
为了防止所有操作并行运行,请在
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
。