Fetch API держит соединение открытым - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю над приложением, которое подключается к нескольким alarmpanels (ELK) в разных местах и ​​читаю статус каждой панели. Я добился соединения и корректного рендеринга, передав информацию о соединении с помощью fetch в почтовом запросе на мой express сервер, где я подключаюсь к каждой системе сигнализации (используя реквизиты со стороны клиента).

Моя проблема в том, что системы охранной сигнализации не позволяют мне повторно подключаться чаще, чем каждые 50 секунд. Я ищу способ сохранить соединение с каждой системой сигнализации после отправки первоначального запроса. Я гуглил, проверил форумы, и ни одно из предложений, например, keep-alive, не работает в моем случае. Я также попытался переписать приложение, используя socket.io, но я не могу заставить приложение правильно отображаться, если данные не передаются на сервер от клиента в строгом формате запрос-ответ.

Код на стороне клиента:

const [startData, setData] = React.useState([]);

    const panelObj = {
      name: props.name,
      host: props.host,
      port: props.port,
      secure: props.secure,
      zones: props.zones
    };


    const strObj = JSON.stringify(panelObj);

    setTimeout ( () => {
    fetch("/api/panels" , {
      method: 'POST', 
      mode: 'cors',
      keepalive: true,
      body: strObj

    })
    .then((result) => {
       const jsonData = result.json();
       return jsonData;
    })
    .then((jsonData) => {
      setData(jsonData);
    })
  }, 50000);

Код на стороне сервера:

app.post('/api/panels', (req, res) => {
  const ElkClient = elkClient.ElkClient;


    let client = new ElkClient({
        connection: {
          name: req.body.name,
          host: req.body.host,
          port: req.body.port,
          secure: req.body.secure
     }
  });

  connectClient(client);


async function connectClient(client) {
  await client.connect();
  const arr = [];
    try {
      const clhost = client.options.connection.host;
      const clport = client.options.connection.port;
      const clsecure = client.options.connection.secure;
      let data = await client.getArmingStatus();
      for (i = 0 ; i < req.body.zones.length ; i ++) {
          const armUpState = await data.areas[i].armUpState;
          const clName = client.options.connection.name;
          const zoneName = req.body.zones[i].name;
          const siteName = req.body.zones[i].site;
          const clzone = req.body.zones[i].zone;
          const totalPanels = req.body.zones.length;

          const info = new PanelStatus(clhost, clport ,clsecure, clzone, siteName, clName, zoneName, armUpState, totalPanels);
          arr.push(info);

      }
      res.json(arr);
    }
    catch (err) {
      console.log("Connection Lost!");
    }
  }
});

Ребята, вы не представляете, как я могу сохранить client.connect () после Рез. json ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...