在Node中的SFTP模块下载和删除文件

我的任务是(或者更好,应该是)简单的:从一个Node应用程序中获取SFTP中的一个目录的内容,然后下载所有的文件并最终远程删除它们。

现在,我检查了不同的模块。 在我看来,非常干净的是ssh2-sftp-client。 我可以这样使用它:

let Client = require('ssh2-sftp-client'); let sftp = new Client(); sftp.connect({ host: myhost, port: '22', username: myusername, password: mypassword }).then(() => { return sftp.list('/path/to/my/files'); }).then((data) => { for(var i = 0 ; i < data.length; i++) { sftp.get('/path/to/my/files/'+data[i].name); } }).catch((err) => { console.log(err, 'catch error'); }); 

我可以列出所有文件,并在控制台中查看生成的jSon,但.get命令似乎什么都不做,我不知道什么是错的。 从文档( https://www.npmjs.com/package/ssh2-sftp-client )你可以得到像我在做的文件。 但:

1)它似乎不工作2)我怎样才能debugging是怎么回事? 3)如果我没有机会select本地目录,那么这些文件最有可能被下载到js由节点启动的地方,对吧?

那么,如何才能获得实际下载的文件,并且如果它们被成功下载到这个模块(或者其他的,如果有的话),可能会被远程删除?

谢谢,法比奥

sftp.get()返回一个返回一个stream的Promise,所以如果你想把stream保存到磁盘上,你需要sftp.get() 。 例如:

 var fs = require('fs'); // ... for(var i = 0; i < data.length; i++) { const remoteFilename = '/path/to/remote/files/' + data[i].name; const localFilename = '/path/to/local/files/' + data[i].name; sftp.get(remoteFilename).then((stream) => { stream.pipe(fs.createWriteStream(localFilename)); }); } 

另外,看起来ssh2-sftp-client没有使用ssh2模块的最新版本分支(在撰写本文时为v0.5.x),所以如果遇到问题请记住这一点。

 sftp.get(remoteFileNameWithPath, true).then(stream => { stream.pipe(fs.createWriteStream(localFilePath)).on('close', () => console.log('completely passed file')) }) 

get方法返回一个具有stream结果的promise,所以,为了保存这个,你需要pipe道到一个writeStream检查nodejs上的文档: https ://nodejs.org/api/stream.html

我不知道会发生什么,但是当我运行这样的代码时,只能下载一个文件。

 for (var i = fileList.length - 1; i >= 0; i--) { remoteFilename = process.env.FTP_DEFAULT_DIR + '/' + fileList[i].name localFilename = fileList[i].name sftp.get(remoteFilename).then((stream) => { stream.pipe(fs.createWriteStream(localFilename)); console.log(stream); console.log('processing: ', remoteFilename); }).catch((err)=> { console.log(err) }); }