@RozmarinUS
YII2, PHP, React, TypeScript, Python hater

Почему не получается получить состояние стороннего сервиса?

Всем привет, почему не получается получить состояние докера? Выводит все только не статус.

router.get('/', (req, res) => {
    db.query('SELECT * FROM endpoints').then((endpoints) => {
        let arr = [];
        endpoints.forEach((i) => {
            if (i.type === 1) {
                let docker;
                if (i.url.match('unix:///var/run/docker.sock')) {
                    docker = new Docker({socketPath: '/var/run/docker.sock'});
                } else {
                    docker = new Docker({host: i.url, port: 2375});
                }

                arr.push({
                    id: i.id,
                    name: i.name,
                    type: i.type,
                    url: i.url,
                    status: docker.ping((err) => !err ? 0 : 1),
                    groupId: i.groupId
                })
            }
        })
        return res.send(arr)
    })
});

Вывод:
[
    {
        "id": "1",
        "name": "local",
        "type": 1,
        "url": "unix:///var/run/docker.sock",
        "groupId": 1
    },
    {
        "id": "2",
        "name": "dev",
        "type": 1,
        "url": "cluster.dev.io",
        "groupId": 1
    }
]

Библиотека: https://github.com/apocas/dockerode
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
docker.ping() видимо, возвращает Promise. Надо дождаться его выполнения и только тогда возвращать ответ.
примерно так
const promises = endpoints.filter((i) => i.type === 1)
.map((i) => {
  const result = {
    id: i.id,
    name: i.name,
    type: i.type,
    url: i.url,
    groupId: i.groupId
  };

  const settings = (i.url.match('unix:///var/run/docker.sock')) ?
      {socketPath: '/var/run/docker.sock'} : {host: i.url, port: 2375};
  const docker = new Docker(settings);

  return docker.ping().then(err => {
    result.status = !err;
    return result;
  })
});

Promise.all(promises).then((results) => res.send(results));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы