Server-sent Events(SSE)是一种轻量级的、基于HTTP协议的服务器推送技术,它允许服务器向客户端推送数据,而无需客户端发起请求。在前端开发中,SSE可以用于实现实时更新、在线聊天、通知提醒等功能。
本文将介绍如何在Node.js应用中实现SSE,包括SSE的原理、SSE的使用方法、SSE的优缺点以及示例代码。
SSE的原理
SSE的原理基于HTTP协议中的长连接(long-polling)。在传统的HTTP请求中,客户端向服务器发起请求,服务器返回响应后连接即关闭。而在SSE中,客户端向服务器发起请求,服务器返回一个持久连接,然后服务器会不断地向客户端发送数据,直到连接关闭。
SSE的数据格式为文本(text/event-stream),并以“data: ”作为前缀,以“\n\n”作为结尾的一系列数据块组成。例如:
data: This is the first message.\n\n data: This is the second message.\n\n
客户端通过监听事件源(EventSource)的onmessage事件来接收服务器发送的数据。例如:
var source = new EventSource('/sse');
source.onmessage = function(event) {
console.log(event.data);
};SSE的使用方法
在Node.js应用中实现SSE,需要使用到一个名为“sse-express”的Node模块。该模块提供了一个中间件函数,用于处理SSE请求。
首先,我们需要安装sse-express模块:
npm install sse-express
然后,在Node.js应用中引入sse-express模块,并使用sse-express中间件函数处理SSE请求。例如:
// www.javascriptcn.com code example
const express = require('express');
const sseExpress = require('sse-express');
const app = express();
app.get('/sse', sseExpress, function(req, res) {
setInterval(function() {
res.sse('data: ' + new Date() + '\n\n');
}, 1000);
});在上述代码中,我们创建了一个路由处理器,用于处理“/sse”路径的请求。该路由处理器使用sse-express中间件函数处理请求,并在每秒钟向客户端发送当前时间。
SSE的优缺点
SSE相比于其他服务器推送技术(如WebSocket)具有以下优点:
- SSE基于HTTP协议,无需额外的协议支持,可以直接使用现有的Web服务器。
- SSE使用简单,只需要使用EventSource对象监听onmessage事件即可。
- SSE支持跨域请求,可以在不同的域名之间进行通信。
但SSE也存在一些缺点:
- SSE只能实现单向通信,即服务器向客户端发送数据,无法实现双向通信。
- SSE的数据传输格式为文本,无法传输二进制数据。
- SSE的兼容性存在问题,在一些老版本的浏览器中可能无法正常工作。
示例代码
完整的示例代码如下,可以在本地运行并测试SSE功能:
// www.javascriptcn.com code example
const express = require('express');
const sseExpress = require('sse-express');
const app = express();
app.get('/', function(req, res) {
res.send(`
<html>
<head>
<title>SSE Example</title>
</head>
<body>
<div id="messages"></div>
<script>
var source = new EventSource('/sse');
source.onmessage = function(event) {
var messages = document.getElementById('messages');
var message = document.createElement('div');
message.textContent = event.data;
messages.appendChild(message);
};
</script>
</body>
</html>
`);
});
app.get('/sse', sseExpress, function(req, res) {
setInterval(function() {
res.sse('data: ' + new Date() + '\n\n');
}, 1000);
});
app.listen(3000, function() {
console.log('Server is running on port 3000');
});在运行示例代码前,需要先安装sse-express模块。在命令行中执行以下命令:
npm install sse-express
然后在命令行中执行以下命令启动服务器:
node server.js
在浏览器中打开“http://localhost:3000/”即可测试SSE功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d15c9ca941bf71342e5c83