2012-10-16 7 views
6

Ho provato di recente a importare un file nel mio progetto node.js esistente. So che questo dovrebbe essere scritto con un modulo, ma includo il mio javascript file esterno come questo:Leggi il file con fs.readFileSync e eval content ... quali scope hanno le funzioni? Come accedere?

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

Il contenuto di simple.js assomiglia a questo:

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(); 
}; 

(Sì, Google modelli di chiusura) .

ora posso chiamare il file di modello utilizzando:

examples.simple.helloWorld(); 

Tutto funziona come previsto. Tuttavia non sono in grado di capire quale sia lo scopo di queste funzioni e dove potrei accedere all'oggetto degli esempi.

Tutto è in esecuzione in un server node.js 0.8 e come ho detto che funziona ... Non so proprio perché?

Grazie per il chiarimento.

risposta

9

eval() inserisce le variabili nello scope locale del luogo in cui è stato chiamato.

È come se lo eval() fosse stato sostituito dal codice nell'argomento stringa.

suggerisco di cambiare il contenuto dei file da:

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

In questo modo, si può dire:

var result = eval(file); 

e sarà evidente in cui tutto è/finisce.

Nota: eval() è un enorme rischio per la sicurezza; assicurati di leggere solo da fonti attendibili.

+0

Grazie mille per il tuo commento. Hai ragione usando la funzione wrapper. Dato che non sono in grado di modificare i file ho usato var examples = eval ('(function() {' + fs.readFileSync ('public/templates/simple.js') + 'return examples;})();') ;! Quindi almeno non devo preoccuparmi di definire il mio spazio dei nomi locale o di ignorare le cose che dovrebbero migliorare la sicurezza. Viene restituita anche solo la parte "conosciuta". In qualche modo ho trovato la risposta al problema dell'oscilloscopio dal nodo stesso ... dato che ogni modulo è racchiuso in un ambito anonimo, non posso davvero accedere a nessuna funzione dall'interno del file con gli [[esempi "] globali ... – Johnnycube

+0

Quindi il problema di base è node.js L'ambito del modulo non mostra queste dannate funzioni ... come posso accedervi per nome? Ancora grazie per il chiarimento – Johnnycube

+0

La stessa risposta di prima: è necessario inserirli nel campo di applicazione locale. Se è necessario rendere 'foo.bar' visibile come' bar', allora si può semplicemente dire 'var bar = foo.bar;'. 'eval()' può vedere 'bar'. –