2012-08-23 29 views
5

El argumento de require(...) en node.js es un nombre de archivo. Si tuviera un código fuente de módulo en una cadenacode, ¿podría de alguna manera llamar al require(code) y cargar funciones desde esa cadena?Requerir en nodejs

+1

http://nodejs.org/api/modules.html#modules_modules (qué uri ridículo) – jAndy

+0

@jAndy ¿Dónde está el código fuente en una cadena? Solo veo cargar desde el archivo. – Cartesius00

+0

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

Respuesta

1

Un problema podría ser escribir el código fuente del módulo en un archivo temporal ./tmp-file.js y luego require('./tmp-file'), y luego eliminar el archivo.

Esto probablemente no sea óptimo porque tendría que bloquear y escribir el archivo de forma síncrona, o poner todo lo que requiera ese módulo en la devolución de llamada a la escritura asíncrona.

Un ejemplo de trabajo para el archivo de escritura asíncrona (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/'); 
}); 

Resultados en:

$ curl 127.0.0.1:1337 
> Hello World 
+0

Gracias, parece una buena solución de referencia. – Cartesius00

+0

En general, estoy de acuerdo, pero eso requiere que la aplicación de nodos pueda crear un archivo en el sistema de archivos. Y si inicia varias instancias de la aplicación de nodo, debe decidir qué hacer con el archivo o el espacio de nombre de alguna manera. Traté de agregar una extensión personalizada, pero ahora está en desuso. ¿No hay otra buena solución? –

2

Pongo esto en una función para su reutilización. Crea un archivo en el directorio temporal del sistema operativo basado en un hash aleatorio, lo requiere y luego 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; 
} 

entonces usted puede hacer:

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

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

Esto es todavía más de una solución, pero más cómodo de usar, creo.

+1

agradable, gracias – Cartesius00