2017-05-02 7 views
0

Ich habe ein Hauptmodul (app.js), das einen Client initialisiert (um REST-API-Aufrufe auszuführen) und Funktionen in diesem Hauptmodul hat, die diesen Client verwenden. Da mein Code immer größer wird, möchte ich meine Hauptmodule modularisieren, indem ich die Funktionen in Module einfüge (zB module_A.js). Was ist die beste Vorgehensweise, um diesen Client für die verschiedenen Module initialisieren und freigeben zu lassen? Ein Weg, über den ich nachgedacht habe, ist ein Client-Modul zu erstellen, das ich in jedem Modul benötige - würde der Client dann nicht mehrfach initialisiert werden? ChristianGemeinsame Nutzung von Variablen über Knotenmodule hinweg

+0

Der beste Weg ist, separate Module zu erstellen, wie Sie bereits tun. Das ist der optimale Weg. Ja, ich glaube, wenn Sie den Client in einem separaten Modul initialisieren, wird er jedes Mal initialisiert, wenn er in verschiedenen Modulen aufgerufen wird. Warum initialisiere es nicht einfach im Code und weise es dem globalen Objekt im Knoten zu und der Zugriff ist überall gleich. wie global.clinst = neuer client(); und dann Zugriff über das Modul als global.clinst.getReq(); ist eine Lösung, die ich fühle. Fühlen Sie sich frei zu kommentieren. Es kann auch andere Wege geben, als könnten Sie es auf Router-Ebene initialisieren und dann den Funktionsaufruf übergeben. –

Antwort

0

Nein. Soweit ich weiß, ist ein Modul ein Singleton, so dass es nur einmal erstellt wird. Wenn ein anderes Modul require das Modul module_A ist, erhalten sie die bereits vorhandene Referenz darauf.

module_A.js

console.log("should only be called ONCE"); 
var module_object = { 
    shared_variable: "initial text" 
}; 

module.exports = module_object; 

caller1.js

var testmod = require("./module_A"); 

console.log("TEST IS:" + testmod.shared_variable); 
testmod.shared_variable += " - included in caller1"; 
console.log("TEST IS:" + testmod.shared_variable); 

caller2.js

var testmod = require("./module_A"); 

console.log("TEST IS:" + testmod.shared_variable); 
testmod.shared_variable += " - included in caller2"; 
console.log("TEST IS:" + testmod.shared_variable); 

Im Test über der Log-Zeile mit "ONCE" nur einmal aufgerufen werden soll , egal wie lange Ihr Server läuft.

Ich bin nicht sicher, wie oft es ausgeführt wird, wenn Sie mehrere Instanzen haben (wie in einem Cluster mit einer Instanz pr.cpu), aber Sie können testen, ob es notwendig ist.

0

Danke für Ihre Antworten. Nachdem ich ein wenig untersucht habe, denke ich, besteht die Lösung darin, jedes Modul (Modul_A, Modul_B usw.) mit dem Rest-Client zu initialisieren, der im Hauptteil erstellt wird. Das wäre so etwas sein:

  • in den wichtigsten app.js:

    var apiClient = ... var module_A = require (‘./ modules/module_A.js') Test. init (apiClient);

  • in module_A.js

    var client = null; 
    
    exports.init = function init(aClient){ 
        client = aClient; 
    } 
    
    exports.myFunction = function(callback){ 
        client.doSomething(function(data){ 
         ... 
    

    }); }

Verwandte Themen