2016-06-01 16 views
0

を使用して、環境変数の値を取得し、私はのNodeJSの実装を探しています:NodeJS再帰的にwinregモジュール

再帰的
reg query "HKEY_CURRENT_USER\Volatile Environment" /s /v CLIENTNAME 

CLIENTNAME変数のレジストリは、揮発性環境\ を検索します。

は、今私が持っている解決策は以下のとおりです。

var Registry = require('winreg'), 
    regKey = new Registry({ 
     hive: Registry.HKCU, 
     key: "\\Volatile Environment\\3\\" // for my use-case, the \\3\\ varies and I need something Dynamic 
    }); 

regKey.get(Registry.DEFAULT_VALUE, function(err, item) { 

    if (err) { 
     console.log("Error get: "); 
     console.log(err); 
    } 
    else { 
     console.log("Success get: "); 
     console.dir(item.value); 
    } 

}); 

は、キーのパスを動的にするためにいくつかのエレガントな方法はありますか?私はこのイベント発光再帰関数を書いた一時的な解決策として

+0

非同期モジュールを見てください。それについての多くの答えがあります。 https://github.com/caolan/async –

答えて

0

(私は間違いなくWINREGライブラリ内の引数の値を変更するラインで何かを期待していたことから、受け入れ答えとしてこれをマークするわけではありません) 私はちょうどNodeJSを学んでおりますので、私は楽しみのためにそれからコンポーネントを作った:

var EventEmitter = require('events').EventEmitter; 

function RegistryDataEvents(env_var_name) { 
    this.events = undefined; 
    this.initEvents(env_var_name); 
} // cunstruct RegistryDataEvents 

RegistryDataEvents.prototype.initEvents = function(env_var_name) { 
    this.events = new EventEmitter(); 
    var _that = this; 
    process.nextTick(
     function() { 
      _that.retrieveClientName(0, false, "", env_var_name); 
     } 
    ); 
}; // initEvents 

module.exports.RegistryDataEvents = RegistryDataEvents; 

RegistryDataEvents.prototype.rerun = function(env_var_name) { 

    this.retrieveClientName(0, false, "", env_var_name); 

}; // rerun 

RegistryDataEvents.prototype.retrieveClientName = function(count, 
                  found, 
                  result, 
                  env_var_name) { 
    var _that = this; 
    if (count === 0) { 
     _that.events.emit('start', result); 
    } 
    if (found) { 
     _that.events.emit('success', result); 
     return; 
    } 
    var key = "\\Volatile Environment\\"+ count +"\\"; 
    var Registry = require('./registry.js'), 
     regKey = new Registry({ 
      hive: Registry.HKCU, 
      key: key 
     }); 

    regKey.get(env_var_name, function(err, item) { 
     if (err) { 
      // obviously this is a downfall of the module, any suggestions will be appreciated :) 
      if (count > 100) { 
       _that.events.emit('failure', result, err, count); 
       return; 
      } 
      _that.retrieveClientName(++count, false, "", env_var_name); 
     } 
     else { 
      found = true; 
      _that.retrieveClientName(++count, true, item.value, env_var_name); 
      return; 
     } 
    }); 
    return; 
}; // retrieveClientName 

使用

var RegistryDataEvents = require('./reg_data_evts.js').RegistryDataEvents; 

// Register the event + listeners 
var reg_data_evts = new RegistryDataEvents("CLIENTNAME"); 

// handle listener logic 
reg_data_evts.events.on('start', function(result) { 
    console.log("Started " + result); 
}); 

reg_data_evts.events.on('success', function(result) { 
    console.log("Success: " + result); 
}); 

reg_data_evts.events.on('failure', function(result, err, count) { 
    console.log("Failure: " + result + " - " + err + " after " + count + " attempts"); 
}); 

// just to show u can rerun the retrieveClientName method 
reg_data_evts.rerun("CLIENTNAME"); 
// just to show u can rerun the retrieveClientName method 
reg_data_evts.rerun("CLIENTNAME");