nodejs下载文件遇到内存超出导致pm2重启

  |  

例子如下,由于 request 下载速度特别快,而自定义的处理方法更不上导致流一直写在内存中得不到释放,所以这里加上了 req.pause();和 req.resume();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const res = await new Promise((reslove, reject) => {
const req = request
.get(url)
.auth(worldCheck.userName, worldCheck.password, false)
.on("response", () => {
console.log("开始");
})
.on("data", async (chunk: any) => {
// _md5.update(chunk);
// 暂停
req.pause();
let data = chunk.toString();
if (lastRow) {
data = lastRow + data;
lastRow = "";
}
let rows: any[] = [];
// 数据正好完整
if (data.slice(data.length - 2) === "\r\n") {
rows = data.split(/[\r\n]/);
} else {
rows = data.split(/[\r\n]/);
lastRow = rows.pop();
}

// 处理数据
if (type === DownloadFileEnum.Wc1) {
await $this.dealRows(rows);
} else if (type === DownloadFileEnum.Wc1Names) {
await $this.dealNamesRows(rows);
}
// 恢复
req.resume();
})
.on("error", (err: any) => {
Logger4.error(err);
reject(false);
})
.on("end", async () => {
// console.log('结束');
// const newSign = _md5.digest('hex');

// if (newSign === sign) {
// 数据正确 保存到数据库
// 保存最后一行数据
if (lastRow) {
const rows = [lastRow];
if (type === DownloadFileEnum.Wc1) {
await $this.dealRows(rows);
} else if (type === DownloadFileEnum.Wc1Names) {
await $this.dealNamesRows(rows);
}
}
reslove(true);
// } else {
// reject(false);
// }
})
.on("close", () => {
console.log("关闭");
req.end();
});
});
文章目录