eventSource.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>eventSource</title>
<style>
/*清除body的影响*/
* {
margin: 0;
padding: 0;
}
</style>
</head>
<script>
let array = [];
const eventSource = new EventSource("http:localhost:9998/events");
// 正常的EventSource,我们只关心以下三个事件
/*
* open:订阅成功(和后端连接成功)
*/
eventSource.addEventListener("open", function (e) {
console.log("open successfully");
});
/*
* message:后端返回信息,格式可以和后端协商
*/
eventSource.addEventListener("message", function (e) {
console.log(e.data);
array.push(e.data);
let html = "";
for (let i = 0; i < array.length; i++) {
const item = array[i];
html += `<li>${item}</li>`;
}
document.getElementsByTagName("title")[0].innerText =
"(" + array.length + ")" + "eventSource";
document.getElementById("list").innerHTML = html;
});
/*
* error:错误(可能是断开,可能是后端返回的信息)
*/
eventSource.addEventListener("error", function (err) {
console.log(err);
// 类似的返回信息验证,这里是实例
err && err.status === 401 && console.log("not authorized");
});
// // 需要关闭了
function close1() {
eventSource.close();
}
</script>
<body>
<div onClick="close1()">关闭</div>
<div id="list"></div>
</body>
</html>
server.js
const express = require('express');
const app = express();
const cors = require('cors')//跨域
app.use(cors())
// 定义一个路由,用于向客户端推送事件
app.get('/events', (req, res) => {
// 设置响应头,指定返回的数据类型为 text/event-stream
res.setHeader('Content-Type', 'text/event-stream');
// 设置响应头,禁用浏览器的缓存
res.setHeader('Cache-Control', 'no-cache');
// 向客户端发送一条消息
res.write('data: Hello, world!\n\n');
// 模拟每隔 5 秒钟向客户端发送一条消息
let index = 0
setInterval(() => {
index += 1;
res.write('data: This is a message from server ' + index + '.\n\n');
}, 3000);
});
// 启动服务器,监听 3000 端口
app.listen(9998, () => {
console.log('Server is running on port 9998.');
});
记得npm i express,cors