0

複数のサーバーから Node を使用して SFTP リストを取得しようとしています。私は ssh2-sftp-client ライブラリを使用しており、futzed Promise.all() を使用して非同期接続を処理しようとしています。

SFTP サーバーは、次のように構成ファイル ( servers.config)に格納されます。

{
  "myhost1": {
    "host": "sftp.myhost1.com",
    "port": "22 ",
    "username":  "userid1",
    "password": "password1"
  },
  "myhost2": {
    "host": "sftp.myhost2.com",
    "port": "22 ",
    "username":  "userid2",
    "password": "password2"
  },
  ...
}

私のコードは次のようになります...

#!/node
let fs = require('fs');
let Client = require('ssh2-sftp-client');

// which servers should we process?
const serverList = fs.readFileSync('./servers.config', {encoding:'utf8', flag:'r'});
const servers = JSON.parse(serverList);

const servers_to_process = Object.keys(servers);

function getDirectoryListing(config) {
  let sftp = new Client();
  sftp.connect(config)
    .then(() => {
      return sftp.list('/');
    })
    .then(data => {
      console.log('Data retrieved for: ',config.host);
      //console.log(data);  // Line B
      sftp.end();
      return data;
    })
    .catch(err => {
      console.log('Error for: ',config.host);
      return [];
    });
}


const processes_to_run = [];

// generate array of promises to run
servers_to_process.forEach( key => {
    log('==========================');
    log("Provider: "+key+"; "+timestamp);
    processes_to_run.push(getDirectoryListing(servers[key]));
  });


// wait for all the promises to resolve...
Promise.allSettled(processes_to_run).
  then((results) => results.forEach((result) => console.log(result)));

私が取得していないのは、コンソールが行 A からログに記録したデータです... しかし、行 B のコメントを外すと、各リストが非同期で取得されます。

出力は次のようになります。

JSON file read correctly
==========================
Provider: myhost1; 01/06/2021, 14:57:25
==========================
Provider: myhost2; 01/06/2021, 14:57:25
{ status: 'fulfilled', value: undefined }
{ status: 'fulfilled', value: undefined }
Data retrieved for:  sftp.myhost1.com
Data retrieved for:  sftp.myhost2.com

だから、明らかに私は約束からデータを返すことにボールを落としています...

これは、処理前にすべてのリストを配列に取得するための正しいアプローチですか? SFTP リスト フェッチの非同期性を考えると、よりクリーンなアプローチはありますか?

4

3 に答える 3