2012-08-23 11 views
5

L'argomento di require(...) in node.js è un nome file. Se avessi un codice sorgente del modulo in una stringacode, potrei chiamare in qualche modo lo require(code) e caricare le funzioni da quella stringa?Richiedi in nodejs

+1

http://nodejs.org/api/modules.html#modules_modules (che uri ridicolo) – jAndy

+0

@jAndy Dove si trova un codice sorgente in una stringa? Vedo solo il caricamento dal file. – Cartesius00

+0

http://nodejs.org/api/modules.html – Thomas

risposta

1

Una soluzione potrebbe essere quella di scrivere il codice sorgente del modulo in un file temporaneo ./tmp-file.js e quindi require('./tmp-file') e quindi rimuovere il file.

Probabilmente questo non è ottimale perché è necessario bloccare e scrivere il file in modo sincrono oppure inserire tutto ciò che richiede quel modulo nella richiamata alla scrittura asincrona.

Un esempio di lavoro per il file asincrona scrittura (gist - also includes sync file write):

var http = require('http'); 
var fs = require('fs'); 

var helloModuleString = "exports.world = function() { return 'Hello World\\n'; }"; 
fs.writeFile('./hello.js', helloModuleString, function (err) { 
    if (err) return console.log(err); 
    var hello = require('./hello'); 

    http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end(hello.world()); 
    }).listen(1337, '127.0.0.1'); 

    console.log('Server running at http://127.0.0.1:1337/'); 
}); 

risultati in:

$ curl 127.0.0.1:1337 
> Hello World 
+0

Grazie, sembra una buona soluzione di base. – Cartesius00

+0

In generale sono d'accordo, ma ciò richiede che l'app nodo possa creare un file sul file system. E se si avviano più istanze dell'app nodo, è necessario decidere cosa fare con il file o lo spazio dei nomi in qualche modo. Ho provato ad aggiungere un'estensione personalizzata, ma ora è deprecata. Non c'è un'altra buona soluzione? –

2

ho messo questo in una funzione per il riutilizzo. Crea un file nella directory os temp basato su un hash casuale, lo richiede e quindi lo elimina.

var fs  = require('fs'), 
    os  = require('os'), 
    crypto = require('crypto'); 

function requireString(moduleString) { 
    var token   = crypto.randomBytes(20).toString('hex'), 
     filename  = os.tmpdir() + '/' + token + '.js', 
     requiredModule = false; 

    // write, require, delete 
    fs.writeFileSync(filename, moduleString); 
    requiredModule = require(filename); 
    fs.unlinkSync(filename); 

    return requiredModule; 
} 

allora si può fare:

var carString = "exports.start = function(){ console.log('start'); };", 
    car  = requireString(carString); 

console.log("Car:", car); 

Questo è ancora più di una soluzione, ma più comodo da usare, credo.

+1

carino, grazie – Cartesius00