我正在尝试使用节点,快速和把手在我的页面上显示当前时间(包括秒)。当然,我想避免每秒刷新页面。我想过使用socket.io,从节点服务器每隔30秒获取一次时间,并在客户端使用javascript递增秒数,但这种方法让我觉得相当hacky。这个问题有标准化的解决方案吗?
编辑:
所以我有点想通了,但我不确定这是否足够有效。有没有办法可以从这段代码中挤出更多东西?
setInterval(function() {
var time = Moment();
if(time.seconds() === 0 || time.seconds() === 1) {
io.emit('time', {
time: time.format('HH:mm'),
date: time.format('DD.MM.YYYY')
});
}
},1000);
答案 0 :(得分:0)
经过大量的摆弄并寻找最好的方法,我偶然发现了server sent events的概念。这是(以非常简单的方式解释),如socket.io,但只有一种方式 - 顾名思义 - 从服务器到客户端。 SSE通过HTTP完全过时,因此不需要任何websockets。
中间件配置:
module.exports = function (req, res, next) {
res.sseSetup = function() {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
res.connection.setTimeout(10800000);
};
res.sseSend = function(data) {
res.write("data: " + JSON.stringify(data) + "\n\n");
};
next();
}
现在使用express注册您的中间件(通常在您的app.js中):
app.use(require('./middlewares/sse'));
并添加必要的路由处理程序:
router.get('/time', function(req, res) {
res.sseSetup();
setInterval(function() {
// create your time object - here: {time: 11:30:01}
res.sseSend(timeObject);
},1000);
});
客户端代码:
<script>
if(!!window.EventSource) {
var timeSource = new EventSource('/time');
timeSource.addEventListener('message', function(event) {
var data = JSON.parse(event.data);
$('.time').text(data.time);
}, false);
}
else {
console.log("[ERROR](server) Your browser does not support SSE");
}
这种情况下的数据对象如下所示:
{
time: '11:30:01'
}
可以随意扩展/调整。
干杯!