我正在使用 Electron 构建一个简单的 SFTP 客户端,并尝试使用 ssh2 模块和该模块中的 SFTPStream 一次下载或上传多个文件。我尝试了许多不同的方法结构,其中一些包括使用 es6-promise-pool。我所做的每一次尝试都会导致文件数组中的一个文件被正确传输,然后是后续的
MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。11 个 sftp_message 监听器添加到 [EventEmitter]。使用emitter.setMaxListeners() 增加限制
消息显示在控制台中,其余文件不会传输。我不确定如何更改我的方法结构以防止这种情况发生。我正在使用 ipcRenderer 告诉 ipcMain 执行我将在此处显示的方法(例如,这是我上传文件的结构)。
let counter = 0;
// Upload local file to server
ipcMain.on('upload_local_files', (event, args) => { // args[0] is connection settings, args[1] is array of file paths
let conn = new Client();
conn.on('ready', () => {
let pool = new PromisePool(uploadFileProducer(conn, args[1]), 10);
pool.start().then(() => {
conn.end();
counter = 0;
let tempArgs = [];
tempArgs.push(curLocalDir);
tempArgs.push(curRemoteDir);
event.sender.send('local_upload_complete', tempArgs);
});
}).connect(args[0]);
});
// Producer used in promise pool to upload files
function uploadFileProducer(conn, files){
if(counter < 100 && counter < files.length){
counter++;
return(uploadFile(conn, files[counter - 1]));
}else{
return null;
}
}
// Function used to upload files in promise pool
function uploadFile(conn, file){
return new Promise((resolve, reject) => {
conn.sftp((error, sftp) => {
return sftp.fastPut(file, curRemoteDir + file.substring(file.lastIndexOf('/') + 1), {}, (error) => {
resolve(file);
});
});
});
}
诚然,使用承诺池对我来说是新事物,我不确定我是否要正确使用它们。关于此主题的另一篇文章使用承诺池来防止我遇到的问题发生,但该示例不涉及 Electron 应用程序(我不知道这是否相关)。我很感激我能得到的任何帮助!