如何使用快速和把手显示节点的当前时间

时间:2017-01-03 07:47:39

标签: node.js express handlebars.js

我正在尝试使用节点,快速和把手在我的页面上显示当前时间(包括秒)。当然,我想避免每秒刷新页面。我想过使用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);

1 个答案:

答案 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'
}

可以随意扩展/调整。

干杯!