javascript – 下载多个SFTP文件时出现NodeJS错误“检测到可能的EventEmitter内存泄漏. 11个错误监听器添加“
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 下载多个SFTP文件时出现NodeJS错误“检测到可能的EventEmitter内存泄漏. 11个错误监听器添加“,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3267字,纯文字阅读大概需要5分钟。
内容图文
使用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
解决方法:
所以你说你试图在prod中下载数千个文件,但你正在为每个文件使用一个监听器.节点仅允许您在触发警报之前最多可以创建10个事件侦听器.
看到:
https://nodejs.org/dist/latest-v8.x/docs/api/events.html#events_eventemitter_defaultmaxlisteners
https://github.com/nodejs/help/issues/1051
如果你想纠正这个问题,我建议你实现一个队列,一次只下载10个文件.
就像是:
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 () => {
// Treat files array as a queue instead of an array
const fileQueue = ['readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt', 'readme.txt'];
// Use this function to grab files from your main files array
const downloadFilesFromQueue = (fileName) =>
new Promise((resolve, reject) => {
// Sanity check
if(!fileName) {
resolve();
}
sftp.get(fileName, true, 'utf8').then((stream) => {
let text = '';
stream
.on('data', (d) => { text += d; })
.on('end', () => {
console.log('Success downloaded file', fileName);
resolve(text);
});
}).catch((err) => {
console.log('Error downloading file', err);
reject(err.message);
});
})
// Handle errors
.catch((err) => console.log(err.message))
// Get next file from the queue
.then(() => {
// If there are no more items in the queue, we're done
if (!fileQueue.length) {
return;
}
downloadFilesFromQueue(fileQueue.shift())
});
// Track all unresolved promises
const unresolvedPromises = [];
// Request no more than 10 files at a time.
for (let i = 0; i < 10; i++) {
// Use file at the front of the queue
const fileName = fileQueue.shift();
unresolvedPromises.push(downloadFilesFromQueue(fileName));
}
// Wait until the queue is emptied and all file retrieval promises are
// resolved.
await Promise.all(unresolvedPromises);
// done
sftp.end();
});
内容总结
以上是互联网集市为您收集整理的javascript – 下载多个SFTP文件时出现NodeJS错误“检测到可能的EventEmitter内存泄漏. 11个错误监听器添加“全部内容,希望文章能够帮你解决javascript – 下载多个SFTP文件时出现NodeJS错误“检测到可能的EventEmitter内存泄漏. 11个错误监听器添加“所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。