@pgs

Асинхронные функции в цикле for in/forEach, как правильно?

Здравствуйте!
Хочу через node.js пройтись в цикле по списку ip, подключиться к каждому по ssh и снять информацию.
Использую пакет npm "simple-ssh":

const SSH = require('simple-ssh');
const hosts = ['192.168.10.1', '192.168.20.1',];
hosts.forEach(function (ip) {
    //console.log(ip);
    const ssh = new SSH({
        host: ip,
        port: '22',
        user: 'root',
        pass: 'password'
    });

    ssh
        .exec('cat /proc/uptime', {
            out: function(stdout) {
                console.log(hosts);
                console.log(stdout);
            }
        })
        .start();

});


В итоге получаю результат подключения только к первому серверу:
[ '192.168.10.1', '192.168.20.1' ]
152026.84 148271.15

Понимаю (возможно не прав) что это из за асинхронности пакета simple-ssh, и надо в цикле работать с ним по другому, подскажите направление.
Заранее спасибо!
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Вот пост на тему (на англ.)

Попробуйте примерно так (не проверял)
const SSH = require('simple-ssh');
const hosts = ['192.168.10.1', '192.168.20.1',];
async function processIPs(ipArr) {
  for (ip of hosts) {
    //console.log(ip);
    const ssh = new SSH({
        host: ip,
        port: '22',
        user: 'root',
        pass: 'password'
    });

    const pr = new Promise((res, rej) => {
      ssh
      .exec('cat /proc/uptime', {
        out: function(stdout) {
          res(stdout);
        }
      })
      .start();
    });
    
    const result = await pr;
    console.log("ip: %s, result: %s", ip, result);
  }
});

processIPs (hosts);
console.log("Done");
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
27 нояб. 2024, в 20:27
1500 руб./в час
27 нояб. 2024, в 20:20
3000 руб./за проект
27 нояб. 2024, в 19:08
1500 руб./в час