1

我正在尝试设置一个 Node.js 应用程序,该应用程序将在 ping IP 时在前端提供一个 HTML 页面。最终结果将有望成为一个静态网页,该网页将显示被 ping 的 IP 的状态。

我的 HTML 页面使用 Express 运行得很好。它基本上只是一个静态文件,其中<a>的文本和颜色由外部脚本更改。暂时,我有一个按钮来切换显示的状态,到目前为止它看起来不错。

问题是,如何根据从Pinger(如下所述)获得的结果更新 HTML?

我有两个 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;

显然,现在,pingerisOnline只能是假的,因为它从未更新过。

附带说明一下,我如何能够从ping.sys.probe回调内部更新 isOnline ?我知道不同的范围,而且我很确定仅仅使用this.isOnline = isAlive是没有用的,因为它this会引用回调(除非我一开始就错了并且想多了)。

4

3 回答 3

0

您需要切换到模板引擎并使页面动态化。您回调可以使用完成的模板调用 res.send / res.end 函数,该模板将被推送回客户端。结帐jade或coffeekup,如果它很简单,只需在函数中构建html而不是使用外部模板。

于 2013-03-04T22:45:08.363 回答
0

你也可以使用socket.io

npm install socket.io

一旦你isOnline在 Pinger 中设置了 from ,在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 之一:

// 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

您是对的,this将参考回调函数的范围。不过,您可以做的是创建this对 pinger 函数的引用。

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

self将是对thisof的引用Func

至于静态页面和服务器之间的通信,您可以简单地向服务器设置一个 Ajax 请求,该请求将简单地返回pinger.isOnline。或者,如果您愿意,您可以使用 socket.io 之类的东西。

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

现在,如果您提出请求/ping,您将收到带有您的 pinger 值的响应。

于 2013-03-04T22:51:15.987 回答