2016-11-02 3 views
1

In einem Node.js-Modul muss ich einen Initialisierungscode ausführen, etwas Code, der nur einmal ausgeführt wird, um eine YAML-Konfigurationsdatei beim Start meiner Anwendung zu parsen.Wie Node.js Modulinitialisierung richtig ausgeführt wird

Als Node.js Novize, habe ich festgestellt, dass Module einmal geladen werden, und nur einmal (und das ist sehr fein so). Ich meine:

// ./mymodule.js 

console.log('mymodule.js was run'); 

... zeigt die angegebene Nachricht nur einmal, auch wenn ./mymodule.js in mehreren geladenen Module benötigt wurde. Und das ist in Ordnung.

Also, für meine init-Code, kann ich mir vorstellen, es zu implementieren einfach so:

// ./mymodule.js 

function mymodule_init() 
    // Parse my config file 
    // ... 
    // Done 
} 

// Run my init: 
mymodule_init(); 

console.log('mymodule.js was run'); 

Aber ist es der richtige Weg, um meine Initialisierung Code auszuführen? Gibt es nicht einen reguläreren Weg dazu, wie zB eine Art "module_init" -Ereignis zu abonnieren, was garantieren würde, dass mein Init-Code einmal und nur einmal ausgeführt würde?

Hinweis: Ich fand diese SO-Link über die Frage: Initialize nodejs module once, use many times, aber es gibt keine wirklich offene Antwort darüber.

Antwort

0

Node.js documention on the subject of module caching Zustände:

Mehr Anrufe verlangen ('foo') kann das Modul Code nicht dazu führen, ausgeführt mehrfach zu sein. Dies ist ein wichtiges Merkmal. Mit ihm können "tlw-done" -Objekte zurückgegeben werden, so dass transitive Abhängigkeiten auch dann geladen werden können, wenn sie Zyklen verursachen würden.

So sehe ich nichts falsch mit Initialisierungscode direkt in einem Modul ausgeführt. Ich tue dies in mehreren Node.js-Anwendungen, wie Sie angeben, etwa so:

// ./mymodule.js 

function mymodule_init() 
    // Parse my config file 
    // ... 
    // Done 
} 

// Run my init: 
mymodule_init(); 

console.log('mymodule.js was run'); 
0

Ihre Frage wird meist rechthaberische Antworten haben, aber trotzdem.

Ich verwende normalerweise eine Singleton-Klasse für diese Art von Arbeit.

So etwas wie

// config.js 

function Config() { 
    this.config = parseYAML("./path/to/yaml-file.yaml"); 
} 

Config.prototype.get = function(property) { 
    return this.config[property]; 
} 

module.exports = new Config(); 

Und in der App oder Module

// app.js 

const config = require("./config.js"); 

console.log(config.get("some-config-property")); 

Die meisten Module verwenden entweder diese oder eine anonyme Funktion, die sofort zum Beispiel genannt wird

module.exports = (function() { 
    return parseYAML("./path/to/yaml-file.yaml"); 
})(); 

In beiden Fällen werden Sie es richtig machen, also ist es eigentlich nicht so wichtig, solange Ihr Code lesbar ist.

+0

Ihre Antwort gut funktioniert und ist besser geschrieben als mein Beispiel, aber es ist nicht wirklich auf die Frage antworten, ich meine, Kann ich dem Node.js-Cache offiziell vertrauen, dass dieser Code nur einmal ausgeführt wird? – yolenoyer

Verwandte Themen