2017-09-26 10 views
2

Ich muss nicht vertrauenswürdige Module laden, die von Dritten geschrieben wurden. Ich benutze vm für die Sandbox und ich dachte, threads (von npm: here) zu verwenden, um das Modul asynchron zu laden und Blockcode zu vermeiden.Warum Funktionen im Modul nicht an den Hauptprozess zurückgegeben werden?

Ich habe den Code auf das Minimum reduziert, weil ich feststecke und ich verstehe nicht, ob das, was ich versuche zu erreichen, unmöglich ist, oder es ist nur ich mit Scopes zu tun. Hier

ist eine Dummy-Modul:

exports.dummy = function() { 
    console.log('Dummy'); 
}; 

exports.val = 5; 

Und hier ist ein Modul, in dem ich versuche, dieses Dummy-Modul mit Threads zu laden:

var spawn = require('threads').spawn; 

var mod; 
var other; 

var t = spawn(function (input, done) { 
    var m = require(input.dir + '/dummyMod'); 
    done({m: m, other: 'hey'}) 
}); 

t.send({dir: __dirname}).on('message', function (result) { 
    mod = result.m; 
    other = result.other; 
    console.log(mod); 
    console.log(other); 
    t.kill(); 
}); 

Die protokollierte Ausgabe lautet:

{ val: 5 } 
hey 

Wie Sie sehen können, wurde die Funktion im Dummy-Modul übersprungen. Wenn ich versuche, das Modul in den Hauptprozess zu laden und zu protokollieren, ist die Funktion natürlich Teil des Objekts.

Antwort

0

Sie müssen die Funktion ordnungsgemäß serialisieren und deserialisieren. JSON.stringify ignoriert Funktionen, wahrscheinlich weil JSON ein Format zum Speichern von Daten ist, keine Skripte.

Serialisieren Sie die Funktion, indem Sie toString() darauf aufrufen. Dann können Sie es als String senden.

done({m: m.toString(), other: 'hey'})

Konvertieren m in einen String wird Ihnen etwas wie folgt aus:

"function m(){console.log(\'called m()\')}"

auf der Empfängerseite, müssen Sie die Funktion deserialisieren.

var m = new Function("return " + result.m)()

+0

Auf diese Weise verliere ich den Funktionsumfang. Wenn zum Beispiel "dummy" "val" zurückgeben soll, wird "val" in seinem Gültigkeitsbereich nicht gefunden. – Zagorax

+0

Ja, Sie werden den Überblick verlieren. Wenn das ein Problem ist, warum nicht das Modul mit require() wie gewohnt laden? Kann das nicht innerhalb eines Threads getan werden? –

+0

Ich muss die von diesem Modul in meinem Hauptprozess exportierten Methoden aufrufen. Trotzdem ist das Modul nicht vertrauenswürdig und wenn es während des Ladevorgangs eine Schleife ausführt, wird die Ausführung blockiert. Deshalb habe ich mir überlegt, es in einen Child-Prozess zu laden und es an den Hauptprozess zurückzugeben, sobald das Require endet. – Zagorax

Verwandte Themen