2012-10-16 6 views
6

Ich habe kürzlich versucht, eine Datei in mein bestehendes Projekt node.js zu importieren. Ich weiß, das mit einem Modul geschrieben werden sollte, aber ich sind meine externe Javascript-Datei wie folgt aus:Datei mit fs.readFileSync und eval-Inhalt lesen ... welche Bereiche haben die Funktionen? Wie erreiche ich?

eval(fs.readFileSync('public/templates/simple.js')+'') 

Der Inhalt simple.js sieht wie folgt aus:

if (typeof examples == 'undefined') { var examples = {}; } 
if (typeof examples.simple == 'undefined') { examples.simple = {}; } 


examples.simple.helloWorld = function(opt_data, opt_sb) { 
var output = opt_sb || new soy.StringBuilder(); 
output.append('Hello world!'); 
return opt_sb ? '' : output.toString(); 
}; 

(Ja, Google Schließung Vorlagen) .

Ich kann jetzt die Template-Datei aufrufen mit:

examples.simple.helloWorld(); 

Alles funktioniert wie erwartet. Ich bin jedoch nicht in der Lage herauszufinden, was der Umfang dieser Funktionen ist und wo ich möglicherweise auf das Beispielobjekt zugreifen könnte.

Alles läuft in einem node.js 0.8 Server und wie ich schon sagte funktioniert es ... Ich weiß nicht genau warum?

Danke für die Klarstellung.

Antwort

9

eval() setzt Variablen in den lokalen Bereich des Ortes, an dem Sie sie aufgerufen haben.

Es ist, als ob die eval() durch den Code in der Zeichenfolge Argument ersetzt wurde.

Ich schlage vor, den Inhalt der Dateien zu ändern:

(function() { 
    ... 
    return examples; 
})(); 

Auf diese Weise können Sie sagen:

var result = eval(file); 

und es wird klar sein, wo alles ist/endet.

Hinweis: eval() ist ein großes Sicherheitsrisiko; Stellen Sie sicher, dass Sie nur von vertrauenswürdigen Quellen lesen.

+0

Vielen Dank für Ihren Kommentar. Sie haben Recht mit der Wrapper-Funktion. Da ich die Dateien nicht ändern kann, habe ich var examples = eval ('(function() {' + fs.readFileSync ('public/templates/simple.js') + 'return examples;})();')! Dann muss ich mir zumindest keine Sorgen darüber machen, meinen lokalen Namespace zu stören oder Dinge zu übersteuern, die die Sicherheit verbessern sollten. Auch wird nur der "bekannte" Teil zurückgegeben. Ich fand irgendwie die Antwort auf das Scope-Problem durch den Knoten selbst ... da jedes Modul in einem anonymen Bereich eingeschlossen ist, kann ich wirklich keine Funktion von innerhalb der Datei mit globalen ["Beispiele"] ... – Johnnycube

+0

So ist das grundlegende Problem node.js Modulbereich zeigt diese verdammten Funktionen nicht ... wie kann ich sie namentlich aufrufen? Nochmals vielen Dank für die Klarstellung – Johnnycube

+0

Gleiche Antwort wie zuvor: Sie müssen sie in Ihren lokalen Bereich legen. Wenn Sie 'foo.bar' als' bar' sichtbar machen müssen, können Sie einfach 'var bar = foo.bar;' sagen. 'eval()' kann 'bar' sehen. –

Verwandte Themen