Я работаю над приложением, которое подключается к нескольким 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 ()?