2017-01-03 9 views
0

ノード、エクスプレス、ハンドルバーを使用して、現在の時間(秒を含む)をページに表示しようとしています。当然私は毎秒ページをリフレッシュすることを避けたい。私はsocket.ioを使用して、ノードサーバーから30秒ごとに時刻を取得し、クライアント側でjavascriptを秒単位でインクリメントすることを考えましたが、このアプローチではかなりハッキリしています。この問題の標準化された解決策はありますか?エクスプレスとハンドルバーを使用して現在の時間をノードで表示する方法

編集:
だから私はちょっと考えましたが、十分に効率的かどうかはわかりません。多分このコードのいくつかを絞る方法はありますか?周りいじると、これを行うための最善の方法を探して多くの後

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

ハンドベルでは決して扱われませんでしたが、そこにはJavaScriptがありません。 SettimeoutまたはsetIntervalはジョブを完了しました –

+0

@sacDahal:しかし、setTimeoutまたはsetIntervalを使用するのはクライアント側でのみ有効でしょうか?しかし、ユーザーのマシンに間違った時間が設定されていると、間違った時間がページに表示されます – Beejay

答えて

0

、私はserver sent eventsの概念つまずきました。これはsocket.ioのように(非常に簡単な方法で説明されていますが)、名前からもわかるように、サーバーからクライアントへの一方通行のみです。 SSEはHTTP経由で完全にオーバーグレードされるため、Webソケットは必要ありません。

ミドルウェア構成:

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

と拡張することができる/意志に調整。

乾杯!

関連する問題