Проверка конкретного ответа от веб-сокета в Vue - PullRequest
0 голосов
/ 21 октября 2018

Моя цель - открыть веб-сокет и получить соответствующие данные, которые возвращаются.До сих пор я успешно выполнял первые пару запросов, которые мне нужно сделать, чтобы затем иметь возможность делать последующие запросы (API, из которого я берусь, требует, чтобы вы запрашивали определенные данные по порядку).

// dashboard component (parent)
<div class="dashboard">
 <header class="dashboard-header">
   <div class="dashboard-header__title">{{dashboardTitle}}</div>
   <div class="dashboard-header__controls">
    <select class="dashboard-header__select-dashboard" v- model="selectedDashboard" @change="getHosts">
     <option
      class="dashboard-header__select-dashboard-option" 
      :value="dashboard" 
      v-for="dashboard in dashboards" 
      :key="dashboard.key">
      {{dashboard}}
     </option>
    </select>
   </div>
  </header>

  <host 
   :host-name="host" 
   :dkrmonWs="dkrmonWs" 
   :selected-dashboard="selectedDashboard" 
   :host-health="hostHealth"
   containerTitle="Container" 
   v-for="host in hosts" :key="host.key">
  </host>
 </div>



<script>
   import host from './host.vue'

   export default {
    name: 'dashboard',
    data() {
     return {
      dkrmonWs: {},
      dkrmonApi: 'wss://api.io:8000',
      selectedDashboard: '',
      dashboards: [],
      hosts: [],
      hostHealth: false
     }
   },
   created() {
      // allows function calls inside if statement
      var that = this;

      // Create the websocket
      this.dkrmonWs = new WebSocket(this.dkrmonApi);
      console.log('Created', this.dkrmonWs);

      // Receives message from server. Parses it. Checks conditions.
      this.dkrmonWs.onmessage = function(e) {
        var response = JSON.parse(e.data)
        console.log('Received Data:', response.responseData);

        // Checks the request 
        switch (response.requestData.request) {
          case 'getDashboards':
            console.log('**Populate Dashboards**');
            that.populateDashboard(response);
            break;
          case 'getHosts':
            console.log('**Populate Hosts**');
            that.populateHosts(response);
            break;
          case 'agentHealth':
            console.log('Received Agent Health', response);
            console.log('I am updating', response.requestData.host, response.responseData.data);

            // assign the response data to the hostHealth data property
            this.hostHealth = response.responseData.data;
            break;
        }
      }

      // When the websocket has opened...
      this.dkrmonWs.onopen = () => {
        console.log('Websocket Opened!');

        // Sends request when Websocket opens to get Dashboards
        var getDashboards = {
          'request': 'getDashboards'
        };

        // Log the request
        console.log('Sending Data to GET DASHBOARDS ', getDashboards);
        // Stringify for server
        var dashboardsRequest = JSON.stringify(getDashboards)
        // send the request 
        this.dkrmonWs.send(dashboardsRequest);
      }
  },
  methods: {
    getHosts() {
      // Build the request for Hosts
      var getHost = {
        'request': 'getHosts',
        'dashboard': this.selectedDashboard
      };

      // Log the request
      console.log('Sending Data to GET HOSTS', getHost);
      // Stringify for server
      var hostRequest = JSON.stringify(getHost);
      // Send the request
      this.dkrmonWs.send(hostRequest);
    },
    populateDashboard(response) {
      // Assisgning Dashboard object to vue data property (to be used in for loop)
      console.log('Building Dashboards with ', response.responseData.data);
      this.dashboards = response.responseData.data
    },
    populateHosts(response) {
      // Assigning Hosts object to vue data property (to be used in for loop)
      console.log('Building Hosts with', response.responseData.data);
      this.hosts = response.responseData.data
    }
  },
  components: {
    host
  },
  props: {
    dashboardTitle: String
  }
}
</script>

Это мой родитель - dashboard.vue, а мой ребенок - host.vue.Я получаю данные сводная панель , а затем данные для каждого хоста в зависимости от панели, которую пользователь выбирает из раскрывающегося списка.Это пока работает, как задумано.Проблема, когда я делаю запрос на здоровье хоста .Я делаю запрос и получаю ответ, как раньше.Ведение журнала работоспособности хоста в консоли Я получаю верные данные.Это отлично.Я не могу связать данные с правильным значением (возвращаемые данные являются логическими значениями).Я использую опору, чтобы отображать состояние host в компоненте host .Но я не уверен, как нацелиться на конкретный хост и привязать его значение к себе.Похоже, веб-сокет просто отправляет обратно 3 логических значения без отношения к каждому хосту.

Как вы можете заметить, я использую цикл for для отображения моих хостов на экране.Я использую 1 on.message для своей веб-розетки.Должен ли я реализовать несколько веб-сокетов для разных компонентов, чтобы я мог знать, что всегда получу ответ, который мне нужен?Когда я впервые пытался заставить это работать, {{hostHealth}} отображался 3 раза (3 хоста отображались из цикла for), но только последний был установлен в значение true.Другие 2 были такими, какими я установил свойство данных в компоненте.

enter image description here enter image description here

// host component (child)
<template>
  <div class="host">
    <h2 class="host__title">{{hostName}}</h2>
    <div class="host__health">{{hostHealth}}</div>
    <div class="host__containers">
      <div class="host__containers-header">
        <div class="host__containers-title">{{containerTitle}}</div>  
      </div>
    </div>
  </div>
</template>

<script>

export default {
  name: 'host',
  data() {
    return {
      images: [],
      containers: [],
      volumes: []
    }
  },
  props: {
    hostName: String,
    containerTitle: String,
    selectedDashboard: String,
    dkrmonWs: {},
    hostHealth: Boolean
  },
  created() {
    // allows function calls inside if statement
    var that = this;

    // log some details
    console.log('hostName:', this.hostName, '!', 'containerTitle:', this.containerTitle, '!', 'selectedDashboard:', this.selectedDashboard, '!', 'dkrmonWs:', this.dkrmonWs);

    // call method
    this.getAgentHealth();
  },
  methods: {
    getAgentHealth() {
      // Build the request for Agent Health
      var healthObject = {
        'request': 'agentHealth',
        'dashboard': this.selectedDashboard,
        'host': this.hostName
      };

      console.log('Sending Data to GET AGENT HEALTH', healthObject);
      var healthRequest = JSON.stringify(healthObject);

      //send request
      this.dkrmonWs.send(healthRequest);
    }
  }
}
</script>

Любая помощь будет оценена.Чтобы быть ясно .Я знаком с реквизитом и провел много часов за чтением, но, похоже, что-то упустил что-то очень очевидное, или моя базовая структура приложения нуждается в переосмыслении.

...