【发布时间】:2018-10-15 21:37:27
【问题描述】:
使用 ssh2-sftp-client 库从 SFTP 站点下载多个文件时出现错误。抛出的错误似乎表明每次下载完成后节点流没有被清除。这导致我的应用程序出现内存泄漏。在生产中,我需要能够下载数千个文件,因此这种内存泄漏非常严重。如何关闭流,以便在每个文件下载后释放内存?
代码:
const Client = require('ssh2-sftp-client');
const sftp = new Client();
sftp.connect({
host: '195.144.107.198',
port: 22,
username: 'demo',
password: 'password'
}).then(async () => {
const fileNames = ['readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt'];
// Loop through filenames
for (let i = 0; i < fileNames.length; i++) {
// Download all the files synchronously (1 at a time)
const fileName = fileNames[i];
await new Promise((resolve, reject) => { // <-- note the await
sftp.get(fileName, true, 'utf8').then((stream) => {
let text = '';
stream
.on('data', (d) => { text += d; })
.on('end', () => {
console.log('Success downloaded file', i);
resolve(text);
});
}).catch((err) => {
console.log('Error downloading file', err);
reject(err.message)
});
});
}
sftp.end();
});
注意:此代码使用公共 SFTP 站点,因此凭据不敏感,您可以运行它进行测试。在这里找到:https://www.sftp.net/public-online-sftp-servers
错误(在文件 #9 下载后发生):
(node:44580) MaxListenersExceededWarning: Possible EventEmitter memory leak detected.
11 error listeners added. Use emitter.setMaxListeners() to increase limit
【问题讨论】:
-
你有没有想过这个问题?我也有同样的问题。
-
我认为这是 'ssh2-sftp-client' 软件包的问题。我切换到只使用“ssh2”,我不再遇到这个问题。
-
针对这个问题运行了 2 天。写了一个答案here
-
检查这个related anser我遇到了同样的问题
标签: javascript node.js sftp node-streams