如何在Node.js中使用来自SSE服务器的数据?

问题描述

我有一台服务器,它定期发出数据。我想在我的rest API中使用这些数据,如何获取呢?从外部源推送数据时,需要自动调用它。我已经尝试了以下代码,但是没有用。

if (Now > resultToday) {
  return resultTomorrow;
} else {
  return resultToday;
}

解决方法

出于测试目的,请在服务器上设置类似的内容。使用和事件名称创建流,以便您可以在客户端上收听它。

const SseStream = require('ssestream')

app.get('/sse',(req,res) => {
  console.log('new connection')

  const sseStream = new SseStream(req)
  sseStream.pipe(res)
  const pusher = setInterval(() => {
    sseStream.write({
      event: 'server-time',data: new Date().toTimeString()
    })
  },1000)

  res.on('close',() => {
    console.log('lost connection')
    clearInterval(pusher)
    sseStream.unpipe(res)
  })
})

在客户端上,您会听到这样的事件

var EventSource = require('eventsource')
var es = new EventSource(url)
es.addEventListener('message',function (e) {
  console.log(e.data)
})
,

当我想从其他微服务中消费SSE时,我遇到了同样的问题,我遵循了这种方法,并且对我有用。

node.js文件

const  eventSource = require('eventsource');

  async socEventStream(req,res) {

    // list of the event you want to consume

    const list = ['EVENT1_NAME','EVENT2_NAME','EVENT3_NAME'];
    try {
      const e = new eventSource('url//of_sse_event',{});
      for (const l of list) {
        e.addEventListener(l,(e) => {
          const data = e.data;

         // Your data
          console.log('event data =====>',data)
          
        });
      };
      res.on('close',() => {
        for (const l of list) {
          e.removeEventListener(l,(e) => {
          });
        }
      })
    } catch (err) {
      console.log(err)
    }
  }

如果您想在node.js上使用事件并将其发送给客户端,则


const  eventSource = require('eventsource');

  async socEventStream(req,res) {
   // setting express timeout for more 24 hrs
   req.setTimeout(24 * 60 * 60 * 1000);

    // setting headers for client to send consumed sse to client

    const headers = {
      'Content-Type': 'text/event-stream','Connection': 'keep-alive','Cache-Control': 'no-cache','Access-Control-Allow-Headers': 'Content-Type,Access-Control-Allow-Headers,Authorization,X-Requested-With,observe,x-access-key','Access-Control-Allow-Methods': 'POST,PUT,GET,OPTIONS,DELETE','Access-Control-Allow-Origin': '*',};
    res.setTimeout(24 * 60 * 60 * 1000);
    res.writeHead(200,headers);

    // list of the event you want to consume

    const list = ['EVENT1_NAME',(e) => {
          const data = e.data;

         // Your data
          res.write(`event:${l}\ndata:${data}\n\n`);
          
        });
      };
      req.on('close',(e) => {
          });
        }
      })
    } catch (err) {
      console.log(err)
    }
  }