2016-08-29 5 views
1

Ich benutze NodeJS. Ist es möglich, eine JavaScript-Datei im Knoten zu verwenden, wie wir es in Browsern tun? Denn wenn ich die require() -Methode benutze, ruft sie eine Javascript-Datei auf, die keinen Zugriff auf die globalen Variablen in meiner server.js-Datei hat. Ich musste mein Modul laden und es zu einer Fortsetzung der Hauptdatei machen, da mein Modul von einigen globalen Variablen abhängt.NodeJs benötigen eine Datei

EDIT:

ich diese server.js Datei haben:

var Settings = require("settings.js"); 
var Clients = require("clients.js"); 
var removePack = []; 

/**HERE RUNS MY WEBSOCKET SERVER**/ 
... 
... 
//When a new socket connects: 
io.on("connection", function(socket){ 
    var socket.id = Math.random(); 
    var client = Clients.create(socket.id); 
}); 

Hier meine clients.js Datei:

exports.create = function(){ 
    self.team = Settings.generateRandomTeam(); /*The problem is here. I can´t access the Settings variable*/ 
    self.maxSpeed = Settings.maxSpeed; 
    ... 
    ... 
    return self; 
} 

EDIT 2:

Wenn ich Einstellungen verwende = require ("settings.js") Ich erhalte den folgenden Fehler:

TypeError: Settings.generateRandomTeam() ist keine Funktion.

Meine settings.js Datei ist wie folgt:

Settings.generateRandomTeam = function(){ 
    //Some code 
} 

module.exports = Settings; 

Dank!

+1

Sie tun einfach 'var foo = require ('foo.js');'. Stellen Sie sicher, dass Sie exportieren, auf was Sie zugreifen möchten – Li357

+0

Stellen Sie sicher, dass Sie den richtigen Pfad verwenden! Wenn Sie Ihre Datei benötigen wie 'var foo = require ('foo.js');' - Dies versucht, ein globales Modul auf Ihrem Computer zu erfordern. Probieren Sie 'var foo = require ('./ foo.js');' – James111

+3

Zunächst denken Sie in node.js niemals darüber nach, globale Variablen zu verwenden (99,9999% oder die Zeit, die sie nicht benötigt werden oder angemessen sind). Sie müssen lernen, wie Module in node.js funktionieren und wie Sie Daten zwischen Modulen teilen. Hinweis: die Verwendung von Globals ist NICHT der Weg Dinge in node.js zu tun. Sie können ein Push- oder Pull-Modell zum Teilen verwenden. Der einfachste Weg besteht darin, einen Modulkonstruktor aufzurufen und ihm die Daten zu übergeben, die Sie freigeben möchten. Dies bezeichne ich als "Push" -Modell, da Sie Daten an das andere Modul zum Teilen weitergeben. – jfriend00

Antwort

1

Um Zugriff auf das Settings Objekt aus der clients.js-Datei zu erhalten, gerade diese zu Ihrer clients.js Datei hinzufügen:

const Settings = require("settings.js"); 

exports.create = function(){ 
    self.team = Settings.generateRandomTeam(); /*The problem is here. I can´t access the Settings variable*/ 
    self.maxSpeed = Settings.maxSpeed; 
    ... 
    ... 
    return self; 
} 

Module in node.js so zwei require() Aussagen zwischengespeichert werden, die exakt die gleichen Dateipfad lösen wird genau das gleiche zwischengespeicherte Modul zurückgeben. Aufgrund des Cachings erhalten Sie also bei jedem Aufruf des Objekts Settings das gleiche Objekt require("settings.js").

Dies ist ein Schlüssel zum Teilen in node.js. Sie denken nicht daran, etwas einmal zu laden und dann versuchen, das überall zu teilen. Stattdessen denken Sie darüber nach, jedes Modul require() in dem zu haben, was es benötigt (wenn möglich). Dies fördert die Unabhängigkeit und Wiederverwendbarkeit Ihrer Module, da sie eher eigenständig nützlich sind und nicht von einer globalen Umgebung abhängen, die bereits für sie entwickelt wurde.

Es gibt natürlich andere Möglichkeiten, Daten zu teilen, indem Daten an ein Modul in einer Modulkonstruktorfunktion übergeben werden oder Daten abgerufen werden, indem ein Modul zu anderen Modulen aufgerufen wird, wenn Daten aus ihnen abgerufen werden. Dies kann in einigen Fällen erforderlich sein, wenn ein Modul eine bestimmte Instanz von etwas (wie einem Datenbankhandle) erhalten muss.

+0

@DanielOliveira - Wo ist 'settings.js'? Wenn es sich im selben Verzeichnis wie "clients.js" befindet, würden Sie es mit 'require ('./ settings.js') 'laden. – jfriend00

+0

Nein, es befindet sich im Stammverzeichnis. –

+0

Aber ich musste die Datei clients.js in die Datei settings.js aufnehmen. Ich habe auch die settings.js in die Datei client.js aufgenommen, weil beide voneinander abhängig sind. Wird dadurch eine unendliche require-Schleife erzeugt und möglicherweise dieses Problem verursacht? –