2017-01-03 3 views
0

Ich versuche, die aktuelle Zeit (einschließlich Sekunden) auf meiner Seite anzuzeigen, mit Knoten, Express und Lenker. Natürlich möchte ich vermeiden, die Seite jede Sekunde zu aktualisieren. Ich dachte über die Verwendung von socket.io, die Zeit alle 30 Sekunden vom Node-Server zu bekommen und die Sekunden mit Javascript auf der Client-Seite zu erhöhen, aber dieser Ansatz scheint mir ziemlich hacky. Gibt es eine standardisierte Lösung für dieses Problem?So zeigen Sie die aktuelle Zeit mit Knoten mit Express und Lenker

EDIT:
Also habe ich es irgendwie herausgefunden, aber ich bin mir nicht sicher, ob das effizient genug ist. Gibt es einen Weg, vielleicht etwas mehr aus diesem Code herauszuquetschen?

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

arbeitete nie mit handelsbars, aber Sie können Javascript dort nicht haben. Settimeout oder setInterval hätte den Job erledigt –

+0

@sacDahal: Aber mit setTimeout oder setInterval würde nur auf Client-Seite funktionieren, oder? Wenn jedoch auf dem Computer des Benutzers eine falsche Uhrzeit eingestellt ist, wird auf der Seite die falsche Uhrzeit angezeigt – Beejay

Antwort

0

Nach viel um das Hantieren und auf der Suche nach dem besten Weg, dies zu tun, stolperte ich über das Konzept der server sent events. Welches ist (erklärt auf sehr einfache Weise) wie socket.io, aber nur eine Möglichkeit - wie der Name schon sagt - vom Server zum Client. SSEs überladen sich komplett über HTTP, so dass keine WebSockets benötigt werden.

Middleware-Konfiguration:

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

Jetzt Middleware mit Express registrieren (in der Regel in Ihrem app.js):

app.use(require('./middlewares/sse')); 

und fügen Sie die notwendigen Routing-Handler:

router.get('/time', function(req, res) { 
    res.sseSetup(); 
    setInterval(function() { 
     // create your time object - here: {time: 11:30:01} 
     res.sseSend(timeObject); 
    },1000); 
}); 

Clientseitiger Code:

Das Datenobjekt in diesem Fall wie folgt aussieht:

{ 
    time: '11:30:01' 
} 

und erweitert/angepasst nach Belieben werden kann.

Prost!

Verwandte Themen