expressJS:如何在获取呼叫时推送socketIO?

时间:2018-10-14 13:59:35

标签: javascript express socket.io

这是我通过socket.IO连接设置简单的expressJS服务器的方式。

我的应用程序每10秒读取一些传感器数据,并将其推送给每个客户端。对我来说这没问题。

但是,一个客户端也可以使用某些参数调用/set-status来更改某些状态数据。在这种情况下,应将新的状态数据发送给每个客户端。这就是为什么简单的请求/响应尝试不起作用的原因。

在调用/set-status之后,我该怎么做才能推动socketIO连接?

const express = require('express')
const http = require('http')
const socketIo = require('socket.io')

const app = express()
const server = http.createServer(app)
const io = socketIo(server)

io.on('connection', socket => {
  getStatus(socket)
  getData(socket)
  setInterval(
    () => getData(socket),
    10000
  )
})

app.get('/set-status', (req, res) => {
  // Change some data and push new data to every client
  // How to get access to socket?
  res.send(200, 'new-data')
})

const getStatus = async socket => {
  const res = { initial: 'data' }
  socket.emit('exampleStatus', res)
}

const getData = async socket => {
  // read some sensor data, which is refreshed every 10 sec.
  // this is working as expected
  const res = { some: 'sensor data' }
  socket.emit('sensorData', res)
}

server.listen(port, () => {
  if (process.env.NODE_ENV !== 'production') {
    console.log(`Listening on port ${port}`)
  }
})

1 个答案:

答案 0 :(得分:0)

如果客户端套接字正在监听exampleStatus事件,则可以从exampleStatus回调内部发出get事件。看起来像这样:io.emit('exampleStatus', data)。在客户端套接字上,您可以编写一个类似于socket.on('exampleStatus, data => // do something with data)的侦听器。