2016-10-26 7 views
1

TCPを介してIoTデバイスに接続するノード&エクスプレスアプリを構築しています。アプリケーションのインデックスページで、私はページをレンダリングし、デバイスにpingを開始する関数を実行しています。最終的にデバイスは応答し、TCPソケットを開き、socket.ioを使用してフロントエンドにイベントを送信します。このプロセスは、ページをレンダリングするよりもはるかに時間がかかります。ページリフレッシュ後のTCPソケット(接続)の状態を保存します。

ページを更新するときに、デバイスを再度pingしたくありません。私は接続の状態を "保存"する必要があります。デバイスが既に接続されていることを知って、私は接続機能を再実行する必要はありません。

可能な解決策。私の考え:

  1. TCPソケットステータスのブール変数。 node.js netドキュメントでは、ソケット接続ステータスの変数が表示されません。もう一つのstackoverflowの答えは、._connectedはドキュメント化されていないので、動作する可能性がありますが、これはnode.jsの方法ではありません。

  2. セッション。私はセッションでデバイスの状態を保存し、再ロード時にそれを追跡することができます。しかし、私の読書に基づいて、私はres.renderが呼ばれた後にセッション情報を保存することができません。私は具体的にはリロード後に接続状況を保存したいと思います。

  3. ローカル変数を使用します。ただし、これはページの読み込み時に「リセット」されます。

  4. JSONファイルに状態を保存します。状態情報を持つ別のdeviceState.jsファイルを使用します。私はそのファイルをエクスポートしてインデックスページの必須モジュールとして使用することができました。

私の質問は - 私は、ページがリロードされた場合でも、デバイス接続の状態を保存することができますか?私の勘違いは、セッション変数とローカル変数のコンボがありますが、私はこれらが上記の私の指摘に基づいてどのように機能するかはわかりません。

ここでは、インデックスルートの簡略化されたバージョンを示します。この問題を解決するのに役立つ何かが欠落している場合はお知らせください:

router.get('/', function(req, res, next) { 
    function connectToDevice() { 
     // ping device and open TCP socket... 
     // eventually the following function is called as an eventlistener to 
     // a net socket.on('connect')... 
     function onConnect(socket) { 
      res.io.emit('machine-online'); 
     } 
    } 
    connectToDevice(); 
    res.render('index', { 
     title: 'Page title' 
    }); 
} 

これは私の初めての投稿です。私はまだ関連するキーワードを学習しており、この問題の解決策を見つけることができませんでした。

+0

私はセッションを使用します。あなたは 'res.render'の事実について確信していますか?やってみました?いずれにしても、サーバーの応答のためにページがハングアップしてから、 'res.render'を実行できるようにすれば、同期呼び出しの約束を使用できると思います。 – Marcs

+0

https://github.com/expressjs/sessionをハングアップすることはできません "このメソッド[session.save()]は、セッションデータが変更されている場合、HTTP応答の最後に自動的に呼び出されます(この動作は変更可能ですミドルウェアコンストラクタのさまざまなオプションを使用して)、このメソッドを呼び出す必要はありません。このメソッドを呼び出すと便利な場合があります。私は応答(res.render)を与えているので、セッションは自動的に保存されます。明示的にセッション情報を保存できるかどうかわかりません。試してみてください。 – user25449

答えて

0

私がこれを解決した方法は#4で、外部JSONに状態を保存します。

deviceStatus.js:JSONオブジェクトの情報を保持するアプリケーション構造のルートにあるファイル。

var status = {}; 
var deviceStatus; 

deviceStatus = function() { 
    status = { 
     "isOnline": false, 
     }; 
    return status; 
}; 

module.exports = deviceStatus(); 

次に、index.jsにdeviceStatusモジュールが必要です。

var status = require('../deviceStatus'); 

そして、私はページをレンダリングするためにこれを使用しています:(図示せず)connectToDevice()関数の中で、私は本当の== status.isOnlineを設定します。ここで、デバイスがオフラインの場合は、ページに接続してレンダリングします。そうでない場合は、ページをレンダリングし、接続しないでください。

if(status.isOnline == false) { 
     connectToDevice(); 
    } 
res.render('index', { 
    title: 'Page title', 
    machineOnline: status.isOnline 
}); 

これを行うより良い方法があるかもしれませんが、これは私のために働く方法です。アプリがステータスを再読み込みするとき。isOnlineはfalseとして開始し、まだ接続されていないので機能します。

関連する問題