Javascript 如何使用SFTP通过ssh2 Node.js模块(在Electron应用程序中)一次下载/上传多个文件?

Javascript 如何使用SFTP通过ssh2 Node.js模块(在Electron应用程序中)一次下载/上传多个文件?,javascript,node.js,electron,ssh2-sftp,ssh2,Javascript,Node.js,Electron,Ssh2 Sftp,Ssh2,我正在使用Electron构建一个简单的SFTP客户端,我正在尝试使用ssh2模块和该模块内的SFTPStream一次下载或上载多个文件。我尝试了许多不同的方法结构,其中一些包括es6承诺池的使用。我每次尝试都会导致要传输的文件数组中的一个文件被正确传输,然后是一个后续文件 MaxListenerSexceedawarning:检测到可能的事件发射器内存泄漏。[EventEmitter]中添加了11个sftp_消息侦听器。使用emitter.setMaxListeners()增加限制 消息显示在

我正在使用Electron构建一个简单的SFTP客户端,我正在尝试使用ssh2模块和该模块内的SFTPStream一次下载或上载多个文件。我尝试了许多不同的方法结构,其中一些包括es6承诺池的使用。我每次尝试都会导致要传输的文件数组中的一个文件被正确传输,然后是一个后续文件

MaxListenerSexceedawarning:检测到可能的事件发射器内存泄漏。[EventEmitter]中添加了11个sftp_消息侦听器。使用emitter.setMaxListeners()增加限制

消息显示在控制台中,其余文件不传输。我不确定如何更改我的方法结构以防止这种情况发生。我使用ipcRenderer告诉ipcMain执行我将在这里显示的方法(例如,这里是我上传文件的结构)

let计数器=0;
//将本地文件上载到服务器
ipcMain.on('upload_local_files',(event,args)=>{//args[0]是连接设置,args[1]是文件路径数组
设conn=newclient();
接通('ready',()=>{
let pool=new PromisePool(uploadFileProducer(conn,args[1]),10);
pool.start()。然后(()=>{
连接端();
计数器=0;
设tempArgs=[];
tempArgs.push(curLocalDir);
临时推送(curRemoteDir);
event.sender.send('local_upload_complete',tempArgs);
});
}).connect(args[0]);
});
//promise池中用于上载文件的生产者
函数uploadFileProducer(连接,文件){
if(计数器<100&&counter{
conn.sftp((错误,sftp)=>{
返回sftp.fastPut(file,curRemoteDir+file.substring(file.lastIndexOf('/'))+1),{},(error)=>{
解决(文件);
});
});
});
}

诚然,承诺池的使用对我来说是新的,我不确定我是否会正确地使用它们。另一篇关于这个主题的帖子使用promise Pool来防止我遇到的问题,但是这个例子没有涉及到Electron应用程序(我不知道这是否相关)。我很感激能得到的任何帮助

问题不在于
警告
,它只是一个警告,在您当前的用例中是正常的。上传的问题是不正确地使用了
PromisePool

我想你在用

您应该向构造函数传递一个promise producer函数,但是您调用该函数并传递一个promise,这就是为什么只上载一个文件的原因

您应该传递生产者而不调用它,或者创建一个返回函数的生产者,或者使用生成器

PromisePool构造函数将承诺生成函数作为其 第一个论点

现在您可以拨打:

let pool = new PromisePool(uploadFileProducer(conn, args[1]), 10)
PromisePool将正确迭代生成器函数返回的迭代器,并相应地处理并发

您还可以创建一个函数,在每次调用时返回一个
Promise

function uploadFileProducer(conn, files) {
  files = files.slice(); // don't want to mutate the original
  return () => uploadFile(conn, files.shift())
}

关于警告,如果您同时上载多个内容,这是正常的,如果是这种情况,您可以使用以下方法增加限制:

emitter.setMaxListeners(n)

你确定没有上传任何内容吗?因为这只是一个警告,如果您同时上载多个文件,这是正常的。只上载阵列中的第一个文件,发出警告,然后关闭连接,而不上载阵列中的其余文件。警告与此无关,我正在发布答案。
function uploadFileProducer(conn, files) {
  files = files.slice(); // don't want to mutate the original
  return () => uploadFile(conn, files.shift())
}
emitter.setMaxListeners(n)