包含变量的变量的文件,以及其他文件是否看到更改?

时间:2016-01-08 17:24:05

标签: javascript node.js

我正在尝试构建一个简单的工具来ping一堆网址以监控其状态,并根据每个应用的状态更新变量。

我还有另一个文件,我希望能够随时执行该文件以获取该变量中每个应用的当前状态。

这是我的主文件,你可以看到有两个导出--start和getStatuses。

index.js

'use strict';

const rest = require('restler');
const time = require('simple-time');
const seconds = time.SECOND;

// The list of apps to check if are running
var apps = {
  myApp: {
    url: 'http://myUrl.com',
    status: null,
    lastUpdatedAt: new Date()
  }
};

/**
 * Loop through and check the status of every app
 */
function checkAllStatuses() {
  for (var name in apps) {
    if (apps.hasOwnProperty(name)) {

      var app = apps[name];
      console.log('app = ', app);
      checkAppStatus(name, app);
    }
  }
}

/**
 * Checks the status of an app
 *
 * @param name  - The name of the app
 * @param app   - The app that we're checking the status of
 */
function checkAppStatus(name, app) {

  var req = rest.get(app.url);

  req.on('complete', function(result, response) {
    if(response.statusCode !== app.status) {
      updateStatus(name, response.statusCode);
    }
  });

  req.on('error', function(e) {
    console.log('ERROR: ' + e.message);
  });

  req.on('timeout', function(data, response) {
    console.log('Request timed out');
  });

}

/**
 * Updates the status of an app
 * 
 * @param app     - The app to update the status of
 * @param status  - The status to update the app to
 */
function updateStatus(name, status) {
  apps[name].status = status;
  apps[name].lastUpdatedAt = new Date();
}

function getStatuses() {
  return apps;
}

function start() {
  // Check every 5 seconds
  setInterval(checkAllStatuses, 5*seconds);
}

module.exports.start = start;
module.exports.getStatuses = getStatuses; 

然后我有一个启动过程的文件:

start.js

'use strict';

const status = require('./index');

status.start();

然后我有一个我想要执行的文件来获取应用程序的当前状态:

consume.js

'use strict';

const status = require('./index');

console.log(status.getStatuses());

问题是consume.js只显示index.js中初始app变量的确切内容:

{
      myApp: {
        url: 'http://myUrl.com',
        status: null,
        lastUpdatedAt: new Date()
      }
    };

当运行start()命令的进程显示非空的更新状态时。

我怎样才能使它消耗.js可以看到start.js正在更新的变量的值?

如果可能的话,我不想使用数据存储区。最糟糕的情况是我写入文件,运行redis,mongo或其他一些数据存储,但我试图避免使这个应用程序尽可能简单。

1 个答案:

答案 0 :(得分:1)

您在index.jsstart.js中使用相同的代码consume.js,但在运行每个文件时创建两个单独的实例。 也就是说,apps变量在start.js创建的实例中发生了变化,但consume.js中没有任何内容告诉您的代码更改apps变量。

如果您没有保存状态历史记录或将数据保存到数据存储区,那么启动例程中的重点是什么?您只需调用checkAllStatuses,然后在希望使用数据时返回结果。

修改 以下是将两个文件(start.jsconsume.js)合并为一个文件的示例。它还添加了一个示例socket.io实现,因为您声明通过websockets向客户端提供状态是实际目标。

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
//// Your status library
var status = require('./index');

//// Start getting statuses
status.start();
app.listen(80);

//
// This is just the default handler
//   in the socket.io example
//
function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {

  // Someone wants the list of statuses
  //   This uses socket.io acknowledgements
  //   to return the data. You may prefer to use 
  //   `socket.emit` instead or an altogether different socket library.
  socket.on('status_fetch', function (data, callback_fn) {
    callback_fn( status.getStatuses() );
  });

});