用Nodejs做应用时,有没有替代轮询查数据的方法啊?
用Nodejs做应用时,有没有替代轮询查数据的方法啊?
node做应用时,需要知道比如说谁给我发了消息之类的,有没有好的替代轮询的方法? websocket我知道可用,但是貌似Nginx负载均衡的时候貌似不支持websocket,而且现在的html5还没包含websocket是吧? 求解…
4 回复
setTimeout + $.ajax()
这个就是间隔多少时间的轮询法吧?
对于这个问题,可以使用Server-Sent Events (SSE) 或 WebSockets 来替代轮询。这里主要讲解一下 Server-Sent Events (SSE) 的实现方法,因为它更容易部署,并且在大多数情况下比 WebSocket 更简单。
示例代码
- 服务端(Node.js)
首先,你需要安装 express
以便创建一个简单的 HTTP 服务器:
npm install express
然后,创建一个简单的 SSE 实现:
const express = require('express');
const app = express();
// 定义一个发送消息的路由
app.get('/stream', (req, res) => {
// 设置响应头
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
// 定时发送消息给客户端
const intervalId = setInterval(() => {
res.write(`data: ${new Date().toISOString()}\n\n`);
}, 1000);
// 在客户端关闭连接时清理定时器
req.on('close', () => {
clearInterval(intervalId);
});
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
- 客户端(HTML + JavaScript)
在客户端,你可以这样获取并处理服务端推送的消息:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SSE Example</title>
</head>
<body>
<script>
if (typeof(EventSource) !== "undefined") {
var source = new EventSource("/stream");
source.onmessage = function(event) {
document.body.innerHTML += event.data + "<br>";
};
} else {
document.body.innerHTML = "Sorry, your browser does not support server-sent events.";
}
</script>
</body>
</html>
解释
- Server-Sent Events (SSE) 是一种允许服务器向浏览器推送实时更新的技术。它通过一个持久的 HTTP 连接实现,使得服务器能够主动地向客户端发送数据。
- 上述服务端代码创建了一个简单的 HTTP 服务器,监听
/stream
路由,并周期性地将当前时间戳发送给客户端。 - 客户端代码则使用
EventSource
对象来订阅/stream
路由,每当服务器推送新的数据时,onmessage
事件处理器会被调用,从而更新页面内容。
这种方法相比轮询更加高效,因为它减少了不必要的请求,并且能够实现实时的数据更新。