2016-06-01 3 views
0

ich für eine NodeJS Implementierung bin auf der Suche von:NodeJS - rekursiv Umgebung abrufen Variablenwert mit WinREG Modul

reg query "HKEY_CURRENT_USER\Volatile Environment" /s /v CLIENTNAME 

Welche rekursiv sucht die \ Volatile Environment Registry für eine CLIENT Variable.

Im Augenblick ist die Lösung, die ich habe, ist:

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); 
    } 

}); 

Gibt es eine elegante Art und Weise den Schlüsselpfad dynamisch zu machen?

+0

Sehen Sie sich das asynchrone Modul an. Es gibt viele Antworten darüber auf SO. https://github.com/caolan/async –

Antwort

0

Als temporäre Lösung, die ich dieses Ereignis emittierende rekursive Funktion schrieb (ich dies als akzeptierte Antwort bin nicht markiert, da ich auf jeden Fall etwas in den Zeilen der Änderung eines Argumentwert in der WINREG Bibliothek erwartet wurde)

Da ich gerade NodeJS Lernen, machte ich eine Komponente aus der es für Spaß:

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 

Nutzungs

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");