2017-05-26 2 views
0

Ich bin ziemlich neu in NodeJs. Ich schreibe meine erste Bewerbung. Ich bin es gewohnt, zu php.Verwenden von Modul innerhalb von Modul in NodeJS

Um den Code organisiert und sauber zu halten, schreibe ich immer Funktionen in separate Dateien und schließe sie in PHP ein.

In Nodejs musste ich sie jedoch erfordern, als würde ich ein Modul benötigen. Zum Beispiel.

functions.js

module.exports = { 
check_db : function(key){ 

}, 

check_cache : function(key){ 
    memcached.get(key,function(err, data){ 
     console.log(data); 
    }); 
}, 

};

enthielten, dass in der Haupt App wie so

// Establish connection with cache and database 
const mysql = require('mysql2'); 
const Memcached = require('memcached'); 
const memcached = new Memcached('localhost:11211'); 
const bb = require('bot-brother'); 

//Load the database cache functions 
const dbc = require("./functions"); 
dbc.check_cache(123); 

Jetzt i die Funktionen von DBC aus der Hauptanwendung Datei zugreifen kann, aber ich kann nicht-Module verwenden, die in der Hauptanwendung aus den Funktionen Datei benötigt wurden . Ich bekomme einen Fehler, dass Memcached nicht definiert ist.

Wie kann ich das Problem lösen?

+0

Mögliche Duplikat [Node.js "require" Funktion und Parameter] (https : //stackoverflow.com/questions/7367850/node-js-require-function-and-parameters) –

Antwort

0

Einfache Lösung, können Sie require("memcached") in der Datei functions.js und erstellen Sie den Server hier. Aber ich würde nicht mit dieser Lösung gehen, da, wenn Sie Memcache woanders benötigen, Sie viele Verbindungen auf dem Memcache-Server geöffnet hätten. Ein weiterer

und sauberere Lösung IMO, ist zu injizieren, um die memcache Abhängigkeit in Ihre Dienste (oder functions, wie Sie sie nennen). (Diese Praxis genannt wird Dependency Injection, wenn Sie wollen, darüber lernen und was sind die Vorteile davon)

Hier ist, wie es funktionieren würde:

  • Sie noch die memcache Verbindung in dem Haupt erstellen Datei ;
  • stattdessen ein rohes Json-Objekt in Ihrem functions.js exportieren, können Sie eine Funktion exportieren, die ein Argument (hier memcache)
  • in Ihrer Hauptdatei dauert, benötigen Sie diese Funktion und rufen Sie den Service, den Sie wollen zu bekommen.

Hier ist, was der Code aussehen würde:

main.js

//Load the database cache functions 
const dbcFactory = require("./functions"); 
const dbc = dbcFactory(memcached) 

functions.js

module.exports = function (memcached) { 
    return { 
    check_db : function(key){}, 

    check_cache : function(key){ 
     memcached.get(key,function(err, data){ 
     console.log(data); 
     }) 
    } 
}; 
+0

Ist keine Abhängigkeitsinjektion ein bisschen unrein auf lange Sicht, wo Sie mehr und mehr Abhängigkeiten weitergeben müssen? –

+0

Die wichtigsten Vorteile von DI (Dependency Injection) ist, dass ** alles explizit ist und dass jeder Dienst, den Sie haben, leicht testbar ist (Sie können verspottete Abhängigkeiten in den Test-Env injizieren).Ich würde sagen, wenn Ihr Code mit DI unordentlich wird, zeigt es, dass Ihre allgemeine Architektur als Probleme und Sie müssen möglicherweise einige Teile neu zu denken :) – atomrc

+0

Es erfordert, dass Sie ein wenig mehr Code schreiben, das stimmt, aber explizit wird definitiv ändern, wie lesbar und verständlich Ihr Code ist – atomrc