3

Electron を使用して単純な SFTP クライアントを構築しており、ssh2 モジュールとそのモジュール内の SFTPStream を使用して、一度に複数のファイルをダウンロードまたはアップロードしようとしています。es6-promise-pool の使用など、さまざまなメソッド構造を試しました。私が試みるたびに、転送するファイルの配列から1つのファイルが適切に転送され、その後、次のファイルが転送されます

MaxListenersExceededWarning: E​​ventEmitter メモリ リークの可能性が検出されました。[EventEmitter] に 11 個の sftp_message リスナーが追加されました。制限を増やすには、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);
      });
    });
  });
}

確かに、promise プールの使用は私にとって初めてのことであり、それらを適切に使用しようとしているかどうかはわかりません。このトピックに関する別の投稿では、私が抱えている問題の発生を防ぐためにプロミス プールを使用していましたが、その例には Electron アプリは含まれていませんでした (関連性があるかどうかはわかりません)。私が得ることができるどんな助けにも感謝します!

4

1 に答える 1