2012-08-23 19 views
5

Argumentem require(...) w pliku node.js jest nazwa pliku. Gdybym miał kod źródłowy modułu w łańcuchucode, czy mógłbym jakoś zadzwonić pod numer require(code) i wczytać funkcje z tego łańcucha?Wymagane w nodejs

+1

http://nodejs.org/api/modules.html#modules_modules (co za niedorzeczne uri) – jAndy

+0

@jAndy Gdzie jest kod źródłowy w ciągu znaków? Widzę tylko ładowanie z pliku. – Cartesius00

+0

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

Odpowiedz

1

Dzieło wokół może być napisać kod źródłowy modułu do pliku tymczasowego, a następnie require('./tmp-file')./tmp-file.js, a następnie usunąć plik.

Prawdopodobnie nie jest to optymalne, ponieważ trzeba by synchronizować i zapisywać plik synchronicznie lub umieścić wszystko, co wymaga tego modułu w wywołaniu zwrotnym, do zapisu asynchronicznego.

przykład roboczych do zapisu plików asynchroniczny (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/'); 
}); 

Skutkuje:

$ curl 127.0.0.1:1337 
> Hello World 
+0

Dzięki, brzmi jak dobre rozwiązanie bazowe. – Cartesius00

+0

Ogólnie zgadzam się, ale to wymaga aplikacji węzła, aby można było utworzyć plik w systemie plików. A jeśli uruchomisz wiele instancji aplikacji węzła, musisz zdecydować, co zrobić z plikiem lub przestrzenią nazw w jakiś sposób. Próbowałem dodać niestandardowe rozszerzenie, ale obecnie jest ono przestarzałe. Czy nie ma innego dobrego rozwiązania? –

2

Ja to do funkcji do ponownego użycia. Tworzy plik w katalogu tymczasowym na podstawie losowego hasha, wymaga go, a następnie usuwa.

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

Następnie można zrobić:

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

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

To jeszcze bardziej obejście, ale bardziej wygodny w użyciu, tak myślę.

+1

ładne, dziękuję – Cartesius00