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.
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
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
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'. –