#node.js #reactjs #websocket #socket.io
Вопрос:
Я новичок в мире мернов, и мне нужна ваша помощь. Я создаю небольшое приложение для панели мониторинга с диаграммами в ReactJS. Это приложение, получающее данные от Node.js сервер каждые 5 секунд. Я представляю свой рабочий процесс таким образом:
- сервер получает данные по почтовому запросу от NodeRed,
- когда запускается запрос 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)