2017-01-03 2 views
0

Я пытаюсь отобразить текущее время (включая секунды) на моей странице, используя узлы, символы express и handlebars. Естественно, я хочу избежать обновления страницы каждую секунду. Я думал об использовании socket.io, получая время каждые 30 секунд от узла сервера и увеличивая секунды с помощью javascript на стороне клиента, но этот подход кажется мне довольно взломанным. Существует ли стандартизированное решение этой проблемы?Как отображать текущее время с узлом с помощью express и handlebars

EDIT:
Так что я понял, но я не уверен, что это достаточно эффективно. Есть ли способ, возможно, выжать еще часть этого кода?

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

никогда не работал с handelbars, но у вас нет javascript. Settimeout или setInterval выполнили бы задание –

+0

@sacDahal: Но использование setTimeout или setInterval будет работать только на стороне клиента, верно? Но если на компьютере пользователя установлено неправильное время, на странице будет отображаться неправильное время – Beejay

ответ

0

После много возился вокруг и ищет лучший способ сделать это, я наткнулся на концепции server sent events. Что (объясняется очень просто), как socket.io, но только один путь - как следует из названия - от сервера к клиенту. SSE полностью переопределяются через HTTP, поэтому нет необходимости в веб-сайтах. Конфигурация

Middleware:

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(); 
} 

Теперь зарегистрировать промежуточное программное обеспечение с курьерским (как правило, в ваших 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' 
} 

и может быть продлен/отрегулировать по желанию.

Cheers!