2016-08-10 10 views
1

私は3つのWebサイトからJSONを取得し、JSONのWebサイトに表示するために送信するnodeJSサーバーを持っています。私が取り入れているウェブサイトのJSONは、10秒ごとに常に更新されています。 NodeJSサーバを常に最新の状態に更新するにはどうしたらいいですか?nodejsサーバーを非同期にする方法

ページを更新することなくこれを行うことはできないと想定していますが、ページが最新表示されていない場合は最適です。

これはNodeJSでは不可能で、これを達成する別の方法がある場合は、あなたが私に言ったのは非常に感謝しています。

コード:

router.get("/", function(req, res){ 
var request = require('request-promise'); 
var data1; 
var data2; 
var data3; 

request("website1.json").then(function(body){ 
    data1 = JSON.parse(body); 

    return request("website2.json"); 
}) 
    .then(function(body) { 
     data2 = JSON.parse(body); 


     return request("website3.json"); 
    }) 
    .then(function(body){ 
     data3 = JSON.parse(body); 

     res.render("app.ejs", {data1: data1, data2: data2, data3: data3}); 
    }) 
}); 
+3

あなたがからセットアップサービスをポーリングすることはできませんクライアントからjs ajax/cometが呼び出されますか?メテオのようなフレームワークを見ることもできます。または、WebSocket経由で自分で設定してください - socket.ioなどのチュートリアルを参照してください。 – ldg

+0

リフレッシュせずにページを非同期に更新することは、2つの異なる概念であり、別々の概念です。また、更新せずにページを更新するには、2つの方法があります。まず、サーバーをまったく変更しないで、定期的に(10秒ごとに)新しいデータを取得するようにブラウザのHTML/javascriptコードを変更します。第2に、彗星のような技術やウェブソケットを使ってプッシュ通知を使用するようにサーバーを変更する。 – slebetman

答えて

3

ここではいくつかの一般的なガイドラインがあります:

  1. があなたの外部サービスから利用可能なAPIを調べます。 WebSocket接続や他の連続したTCP接続を行うことができるものがあれば、状況が変わったときにリアルタイム(またはリアルタイムに近い)通知を得ることができます。もしそうなら、あなたのサーバーにそれを使用させてください。

  2. 外部サーバーからのリアルタイム通知APIがない場合は、xx秒ごとにポーリングする必要があります。 a)どのくらいの頻度であなたのWebページに新しいデータが必要なのか(例えば、5分以内のデータが大丈夫かもしれないなど)b)利用規約レート制限はサードパーティのサービス(たとえば、あなたがそれをポーリングできる頻度など)とc)サーバーがサーバーの負荷の観点からそれをポーリングする余裕があるかどうかなどです。

  3. 外部サービスをポーリングする頻度を把握したら、定期的なポーリングメカニズムを構築します。最も簡単な方法は、ポーリング間隔の時間に設定されているsetInterval()を使用することです。私はいくつかの温度センサーを繰り返しチェックするためにsetInterval()を使用するラズベリーpi node.jsサーバーを持っています。あなたの状況に適したインターバル時間を選択する限り、そのメカニズムはうまくいきます。

  4. 新しい情報を接続されたWebページに戻すには、サーバにwebSocketまたはsocket.io接続を行うためのWebページ用の「リアルタイム」更新プログラムを取得する最善の方法があります。これは、メッセージがいずれかの方法で送信される連続接続されたソケットです。したがって、このメカニズムを使用して、クライアントはサーバーとのsocket.io接続を行います。サーバーはその接続を受け取り、接続はそのWebページの存続期間中は開いたままです。それから、あなたのサーバにそのウェブページに送る必要のある新しいデータがあるときはいつでも、そのsocket.io接続を介してメッセージを送ることができます。ウェブページはそのメッセージを受信し、メッセージのデータに基づいてウェブページの内容を更新することができる。ページを更新する必要はありません。ここで

は、サーバコードの概要です:

// start up socket.io listener using your existing web server 
var io = require('socket.io')(app); 

// recurring interval to poll several external web sites. 
setInterval(function() { 
    var results = {}; 
    request("website1.json").then(function (body) { 
     results.data1 = JSON.parse(body); 
     return request("website2.json"); 
    }).then(function (body) { 
     results.data2 = JSON.parse(body); 
     return request("website3.json"); 
    }).then(function (body) { 
     results.data3 = JSON.parse(body); 
     // decide if anything has actually changed on external service data 
     // and whether anything needs to be sent to connected clients 
     io.emit("newData", results); 
    }).catch(function(err) { 
     // decide what to do if external service causes an error 
    }); 
}, 10000); 

クライアントコードは、このように、一般的に次のようになります。

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io(); 
    socket.on("newData", function(data) { 
     // process new data here and update the web page 
    }); 
</script> 
+0

私が正しく理解していれば、私がアクセスしているAPIがwebSocket接続を持っていないので、socket.ioが私を作成します。これは非常に啓発的なポストだった、ありがとう! – CtrlAltDelete

+0

@saltyalty - いいえ、そうではありません。 socket.io接続はwebSocketサポートを必要とし、socket.ioをサポートするサーバーにのみ接続できます。したがって、あなたが持っているAPIにwebSocketやsocket.ioが組み込まれていない場合は、それをポーリングするために行うことができます。 Webページと自分のサーバの間でsocket.ioを使うことができます。なぜなら両端を制御して両端にsocket.ioサポートを追加できるからです。 – jfriend00

+0

私は参照してください。 webSocketを作成するためのAPIにアクセスすることはできないので、どうすれば投票できますか? – CtrlAltDelete

関連する問題