Javascript 在Node.js中实现服务器发送事件的简单方法?

Javascript 在Node.js中实现服务器发送事件的简单方法?,javascript,node.js,server-sent-events,Javascript,Node.js,Server Sent Events,我环顾四周,似乎Node.js中实现SSE的所有方法都是通过更复杂的代码实现的,但似乎应该有一种更简单的方法来发送和接收SSE。是否有任何API或模块可以简化此操作?您应该能够使用。首先,您需要使用npm install socket.io安装它。从这里开始,在您的代码中,您将希望有var io=require(socket.io) 你可以看到 您可以在服务器上使用类似以下内容: var express = require('express'); var app = express(); var

我环顾四周,似乎Node.js中实现SSE的所有方法都是通过更复杂的代码实现的,但似乎应该有一种更简单的方法来发送和接收SSE。是否有任何API或模块可以简化此操作?

您应该能够使用。首先,您需要使用npm install socket.io安装它。从这里开始,在您的代码中,您将希望有
var io=require(socket.io)

你可以看到

您可以在服务器上使用类似以下内容:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('../..')(server);
var port = process.env.PORT || 3000;

server.listen(port, function () {
  console.log('Server listening at port ' + port);
});

app.use(express.static(__dirname + '/public'));

io.on('connection', function (socket) {
    socket.emit('EVENT_NAME', {data});
});
客户机上有类似的内容:

<script src="socket_src_file_path_here"></script>
<script>
  var socket = io('http://localhost');
  socket.on('EVENT_NAME', function (data) {
    console.log(data);
    //Do whatever you want with the data on the client
  });
</script>

变量套接字=io('http://localhost');
socket.on('EVENT_NAME',函数(数据){
控制台日志(数据);
//对客户端上的数据执行任何操作
});

我在node.js中找到了SSE实现

Github链接:

NPM模块:


上面的链接对您有帮助吗?

我在这里添加了一个简单的SSE实现。这只是一个Node.js文件

**client.js**

var eventSource = new EventSource("/route/events");
eventSource.addEventListner("ping", function(e){log(e.data)});

//if no events specified
eventSource.addEventListner("message", function(e){log(e.data)});

**server.js**

http.createServer((req, res)=>{

    if(req.url.indexOf("/route/events")>=){

      res.setHeader('Connection', 'keep-alive');

      res.setHeader("Cache-Control", "no-cache");

      res.setHeader("Content-Type", "text/event-stream");

      let event = "event: ping";

      let id = `id: ${Date.now()}`;

      let data = {
         message:`hello @${new Date().toString()}`
      }

      data = "data: "+JSON.stringify(data);

      res.end(`${event}\n${id}\n${data}\n\n`);
   }
}).listen(PORT)
您可以在此处查看结果:

consthttp=require('http');
const port=process.env.port | 3000;
const server=http.createServer((req,res)=>{
//服务器发送事件终结点
如果(req.url=='/events'){
文书标题(200{
“内容类型”:“文本/事件流”,
“缓存控制”:“无缓存”,
“连接”:“保持活动状态”,
});
常量刷新率=1000;//以毫秒为单位
返回设置间隔(()=>{
const id=Date.now();
const data=`Hello World${id}`;
常量消息=
`重试:${refreshRate}\nid:${id}\n数据:${data}\n\n`;
res.write(消息);
},刷新率);
}
//客户端
res.writeHead(200,{'Content-Type':'text/html'});
res.end(`
上海证券交易所
var eventSource=new eventSource('/events');
eventSource.onmessage=函数(事件){
document.getElementById('log')。innerHTML+=event.data+'
'; }; `); }); 监听(端口); server.on('error',(err)=>{ 控制台日志(err); 过程。退出(1); }); server.on('正在侦听',()=>{ log(`listing on port${port}`); });
这是一台express服务器,每秒发送一个服务器发送事件(SSE),从10倒计时到0:

const express = require('express')

const app = express()
app.use(express.static('public'))

app.get('/countdown', function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  })
  countdown(res, 10)
})

function countdown(res, count) {
  res.write("data: " + count + "\n\n")
  if (count)
    setTimeout(() => countdown(res, count-1), 1000)
  else
    res.end()
}

app.listen(3000, () => console.log('SSE app listening on port 3000!'))
将上述代码放入一个文件(index.js)并运行它:
node index

接下来,将以下HTML放入文件(public/index.HTML):


如果(!!window.EventSource){
var source=new EventSource(“/countdown”)
source.addEventListener('message',函数(e){
document.getElementById('data')。innerHTML=e.data
},错)
source.addEventListener('open',函数(e){
document.getElementById('state').innerHTML=“已连接”
},错)
source.addEventListener('error',函数(e){
const id_state=document.getElementById('state'))
if(e.eventPhase==EventSource.CLOSED)
source.close()
if(e.target.readyState==EventSource.CLOSED){
id\u state.innerHTML=“断开连接”
}
else if(e.target.readyState==EventSource.CONNECTING){
id\u state.innerHTML=“正在连接…”
}
},错)
}否则{
console.log(“您的浏览器不支持SSE”)
}
苏格兰和南方能源公司:
数据:

在浏览器中,打开
localhost:3000
并观看SSE倒计时。

如果您使用的是express,这是最简单的方法

关于BE:

const SSE = require('express-sse');

const sse = new SSE();

...

app.get('/sse', sse.init);

...

sse.send('message', 'event-name');
关于FE:

const EventSource = require('eventsource');

const es = new EventSource('http://localhost:3000/sse');

es.addEventListener('event-name', function (message) {
  console.log('message:', message)
});

使用套接字怎么样?@Daniel,SSE在HTTP上运行,HTTP在TCP套接字上运行:)“websockets”更合适。然而,现在有很多图书馆在做SSE。我个人创建是因为我对现有的软件包不满意。我在看一些简单的东西,找不到任何东西,所以我使用nodejs制作了一个非常简单的SSE服务器。在生产中使用它是很困难的,但是你应该添加一个认证中间件。我绝对反对这种方法!我现在使用Socket.IO已经很长时间了,我可以肯定地说,随着时间的推移,您将开始承受很多痛苦。服务器端事件是单向的,套接字是双向的。一种是请求-响应类型,另一种是长连接类型。差别是巨大的,您完全不需要套接字-您将不得不处理重新连接、垃圾邮件保护、服务器宕机,可能还有集群。使用简单的SSE,它已经在浏览器中实现了!请看其他答案!OP要求的是SSE,而不是WebSocket。这是一个很好的答案,因为它使用了任何第三方依赖项:)但是我想指出,
res.end(message)
应该替换为
setInterval(()=>res.write(message),1000)
,因为连接不应该结束,应始终使用相同的连接,但您当前的代码导致客户端每隔1秒重新连接并创建一个新连接感谢@KarlisBikis的评论。你完全正确。我已将您的代码建议添加到我的帖子中。谢谢你能帮帮我吗,我正在做和你提到的一样的事情,但是我的数据在
res.end()
一次发送出去,我甚至在每次
res.write()
之后都尝试过
res.flush()
,但没有任何效果。我的问题在这里
const EventSource = require('eventsource');

const es = new EventSource('http://localhost:3000/sse');

es.addEventListener('event-name', function (message) {
  console.log('message:', message)
});