Как отправить данные, поступившие на конечную точку post, через io.emit? NodeJS Реагирует

#node.js #reactjs #websocket #socket.io

Вопрос:

Я новичок в мире мернов, и мне нужна ваша помощь. Я создаю небольшое приложение для панели мониторинга с диаграммами в ReactJS. Это приложение, получающее данные от Node.js сервер каждые 5 секунд. Я представляю свой рабочий процесс таким образом:

  1. сервер получает данные по почтовому запросу от NodeRed,
  2. когда запускается запрос POST, я хотел бы взять тело запроса и отправить его через io.emit клиентскому компоненту. Это то, что я пробовал, но это не работает…
 .
.
.
let variable1 = 0; <-initial value

io.on("connection", (socket) => {
  console.log("Client connected");
  io.emit("event1", {name: "Test", value: variable1});
    
  socket.on("disconnect", () => {
    console.log("Client disconnected!");
  });
});

const postMeasurement = async (req, res, next) => {
  const { value } = req.body;
  variable1=value;
.
.
.
 

Заранее благодарю вас за ваше время и помощь.

Ответ №1:

Для начала сначала создайте событие с помощью io.emit

 io.on('connection',(socket)=>{
  console.log('Client Connected');
  io.emit('myevent','data_goes_here');
  socket.on('disconnect',()=>{console.log('Client Disconnected')});
});
 

Теперь в вашем обычном файле JS:

 var dataGotten;
// recieve event
socket.on('myevent',(data)=>{
  dataGotten=data;
});
 

Теперь, чтобы отправить обратно в ваш файл nodejs:

 // data comes back in parameter
socket.on('myevent',(data)=>{
  dataGotten=data;
  socket.emit('gottenEvent',true);
});
 

Для сбора данных из сокета.io мы также используем socket.on :

 io.on('connection',(socket)=>{
  console.log('Client Connected');
  io.emit('myevent','data_goes_here');
  socket.on('disconnect',()=>{console.log('Client Disconnected')});
  socket.on('gottenEvent',(isTrue)=>{
    if(isTrue){
      console.log('Client Successfully Recieved Message!');
    }
  }
});
 

Ответ №2:

Вы не излучаете событие.

 io.emit("event1", {name: "Test", value:new_value});
 

теперь вы выдадите событие с правильным значением.
Теперь вы можете выбрать, как осуществлять регулярные звонки .
Проще всего было бы в Сетинтервале ,

 setInterval(async()=>{
 let res = await POST_API_CALL_TO_NODE_RED;
  io.emit("event1", {name: "Test", value:res.body.val});
},5000)