无法显示socket.io发送的实时数据

问题描述 投票:0回答:0

最近在尝试使用Socket.io,在客户端和服务器之间建立了成功的连接并且工作正常。但我想要的解决方案是每 5 秒记录一次数据。并每 5 秒在 chart.js 中显示更新的数据。

现在,当我更改数据的值时,它确实会在控制台中更新,但要在 web 中显示,我必须刷新生成另一个请求的页面以及生成一个新的套接字,这会影响 5-10记录的秒间隔。

而且我相信如果有超过 1 个用户使用它,那么服务器将无法处理多个请求。当我尝试在 setInterval 中使用 socket.io 时,我发现这是错误的方法。

总而言之,我只想每 5 秒记录一次数据并显示一次数据。其中我不必刷新网页并打开多个 socket.io.

我已经尝试过使用短轮询、长轮询和 socket.io 多次尝试,但我想要么我没有正确使用它,要么我错过了一些东西。

''' Javascript(nodejs)

io.on("connection",(socket)=>{
    console.log("User connected: "+socket.id)

    function getRegisterValues(){
        client.readHoldingRegisters(69, 20, function(err, data) {
                
            let l=[]
            const dataTypes=['Real','Real','Int','Real','Real','Int','Real','Real','Int','Real','Real','Int']
            var i=0
            var c=0
            while(i<data.buffer.length){
                let s=[]
                
                while(s.length<3){
                    if(dataTypes[c]=='Real'){
                        s.push(data.buffer.readFloatBE(i).toFixed(4))
                        i=i+4
                    }
                    if(dataTypes[c]=='Int'){
                        s.push(data.buffer.readInt16BE(i))
                        i=i+2
                    }
                    c+=1
                }
                l.push(s)
            }
            for(var j=0;j<l.length;j++){
                console.log("Array element: "+l[j])
            }
            
            pool.query(`Select ${x},id from modbus_plc1;`,(err,data)=>{
                if (err){
                    throw err
                }
                var numArray=[]
        
                let arr=Object.keys(data)
                
                var id=data.map(function(str) {
                    return parseInt(Object.values(str)[1])
                })
                var numArray=data.map(function(str) {
                    return parseInt(Object.values(str)[0])
                })
                socket.emit('allData',{allData:data})
            })


    
            pool.promise().query('insert into modbus_plc1(ND_5101_SCRE_Hz,ND_5101_SCRE_Amp,ND_5101_SCRE_Status,ND_5101_ARM_Hz,ND_5101_ARM_Amp,ND_5101_ARM_Status,ND_5102_SCRE_Hz,ND_5102_SCRE_Amp,ND_5102_SCRE_Status,ND_5102_ARM_Hz,ND_5102_ARM_Amp,ND_5102_ARM_Status) values ('+l[0][0]+','+l[0][1]+','+l[0][2]+','+l[1][0]+','+l[1][1]+','+l[1][2]+','+l[2][0]+','+l[2][1]+','+l[2][2]+','+l[3][0]+','+l[3][1]+','+l[3][2]+')')
            .then( ([row,fields])=>{
                      console.log(row)
                }) 
                .catch(console.log)
                //.then( ()=>pool.end() );
            
            socket.emit('message',{data:l})
        })
    }

    getRegisterValues()

   setInterval(()=>{getRegisterValues()},5000)
})

'''

这是我的代码,我使用 setInterval() 方法只是为了在网页上显示更新的数据,因为尽管值已在 socket.io 中更新,但该值并未反映在网页上。

javascript node.js socket.io long-polling real-time-data
© www.soinside.com 2019 - 2024. All rights reserved.