node.jsでnginxサーバーのステータスを読み取る簡単なスクリプトを作成しています。私の問題はnode.js自体に関係しているとは思いませんが、setInterval()関数の使用方法に問題があります。
すべてのコードを貼り付けたくはありません。読みにくくなるためです。このコードを実行すると、次のように表示されます。
pre-Timer for web25
pre-Timer for web26
pre-Timer for web27
pre-Timer for web28
pre-Timer for web29
Timer for web29
Fetch host? web29
Timer for web29
Fetch host? web29
Timer for web29
Fetch host? web29
Timer for web29
Fetch host? web29
Timer for web29
Fetch host? web29
ご覧のとおり、タイマーはループの最後のホストのみを使用しています。どういうわけか、変数のコピーを setInterval スコープに作成していません。
私は何を間違っていますか?
コードの一部:
var http = require('http');
StatsNginxMapper.prototype = {
nginxServers: new Object(),
mysql: null,
mysqlClient: null,
statsDb: 'serverstats',
userMapper: null,
init: function() {
this.mysql = require('mysql');
this.mysqlClient = /* mysql stuff */;
this.collectData();
},
setUserMapper: function(mapper) {
this.userMapper = mapper;
},
collectData: function() {
this.collectServers();
},
collectServers: function() {
var self = this;
var server = null;
/* Normally this is done through MySQL, but for now lets do it manually */
server = new StatsNginxServer();
server.setHost('web25');
this.nginxServers['web25'] = server;
server = new StatsNginxServer();
server.setHost('web26');
this.nginxServers['web26'] = server;
server = new StatsNginxServer();
server.setHost('web27');
this.nginxServers['web27'] = server;
server = new StatsNginxServer();
server.setHost('web28');
this.nginxServers['web28'] = server;
server = new StatsNginxServer();
server.setHost('web29');
this.nginxServers['web29'] = server;
this.loopServers();
},
loopServers: function() {
for(var host in this.nginxServers) {
var nginxServer = this.nginxServers[host];
if(nginxServer.hasTimer()) continue;
var self = this;
console.log('pre-Timer for ' + host);
var timerId = setInterval(function() {
console.log('Timer for ' + host);
self.getData(host);
}, 2000);
nginxServer.setTimer(timerId);
}
},
getData: function(host) {
console.log('Fetch host? ' + host);
},
}