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.
Auf diese Weise verliere ich den Funktionsumfang. Wenn zum Beispiel "dummy" "val" zurückgeben soll, wird "val" in seinem Gültigkeitsbereich nicht gefunden. – Zagorax
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? –
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