1

IP を ping しながらフロントエンドで HTML ページを提供する Node.js アプリケーションをセットアップしようとしています。最終結果は、ping されている IP のステータスを表示する静的な Web ページになることを願っています。

Express を使用して HTML ページを正常に実行しています。<a>基本的には、外部スクリプトによってテキストと色が変更される単一の静的ファイルです。一時的に、表示されたステータスを切り替えるボタンがあり、これまでのところうまくいっています。

Pinger質問は、 (以下で説明する)から取得した結果に基づいて HTML を更新するにはどうすればよいですか?

2 つの Node.js ソース ファイルがあります。明らかに、主なものはserver.js次のとおりです。

var express = require("express"),
app     = express(),
Pinger  = require("./pinger");

app.use(express.static(__dirname));
console.log("Using static files at /");
app.use("/styles", express.static(__dirname + '/styles'));
console.log("Using stylesheets at /styles");
app.use("/res", express.static(__dirname + '/res'));
console.log("Using resources at /res");

app.listen(3000);
console.log("Listening on port 3000");

var pinger = new Pinger('google.com'); /* how the instance would be created */

そして、Pingerモジュールがあります:

var ping  = require('ping');

var Pinger = function() {

    this.host = arguments.length > 0 ? arguments[0] : 'google.com'; 
    this.isOnline = false;

    this.pingAll = function pingAll() {

        console.log(">>PING: " + host);
        ping.sys.probe(host, function(isAlive) {
            if (isAlive) console.log(">>PONG: " + host);
            else console.log("Unable to reach " + host);
        });

        // somehow return isAlive

    };

};

module.exports = Pinger;

明らかに、現在のところ、ピンガーisOnlineは更新されていないため、false である可能性があります。

ping.sys.probeちなみに、コールバック内から isOnline を更新するにはどうすればよいですか? 私はさまざまなスコープを認識しており、コールバックを参照するthis.isOnline = isAliveため、使用するだけでは役に立たないと確信しthisています(そもそも間違っていて考えすぎない限り)。

4

3 に答える 3

0

また、使用することができますsocket.io

npm install socket.io

isOnlinePingerの内側からを設定したら、次のように設定しますserver.js

var socketio = require('socket.io');
var io = socketio.listen(app);

io.sockets.on('connection', function(socket) {
  var msg = 'Cannot reach host';
  if (pinger.isAlive) {
    msg = 'Host is reachable';
  }
  socket.emit('ping result', {
    msg: msg
  });
});

クライアントのJavaScriptの1つから:

// client.js
var socket = io.connect();

socket.on('ping result', function(data) {
  $('div.ping-result').html(data.msg);
});

あなたのhtmlで:

<script src="javascripts/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script src="javascripts/client.js"></script>

<div class="ping-result"></div>
于 2013-03-04T23:11:59.850 に答える
0

テンプレート エンジンに切り替えて、ページを動的にする必要があります。コールバックは、クライアントにプッシュバックされる完成したテンプレートで res.send / res.end 関数を呼び出すことができます。外部テンプレートを使用するのではなく、関数でhtmlを構築するだけの場合は、jadeまたはcoffeekupをチェックアウトしてください。

于 2013-03-04T22:45:08.363 に答える
0

あなたは正しいですthis、コールバック関数のスコープを参照します。ただし、できることはthis、pinger 関数への参照を作成することです。

Func = function () {
   var self = this;
   self.isOnline = false
   asyn(function (online) {
      self.isOnline = online;       
   }
}

selfthisの への参照になりFuncます。

静的ページとサーバー間の通信に関しては、サーバーへの Ajax リクエストを簡単に設定できます。これは単純に return になりpinger.isOnlineます。または、必要に応じて、socket.io のようなものを使用することもできます。

app.get('/ping', function (req, res) {
   res.json(200, {"ping": pinger.isOnline});
}

要求/pingすると、pinger の値を含む応答が返されます。

于 2013-03-04T22:51:15.987 に答える