我需要加载由第三方编写的不受信任的模块。我正在使用 vm
作为沙箱,并且我正在考虑使用 threads
(来自 npm: here )以便异步加载模块并避免阻塞代码。
我已将代码精简到最少,因为我陷入困境,我不明白我想要实现的目标是否不可能,或者只是我搞乱了范围。
这是一个虚拟模块:
exports.dummy = function () {
console.log('Dummy');
};
exports.val = 5;
这是一个模块,我尝试使用线程加载这个虚拟模块:
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();
});
记录的输出是:
{ val: 5 }
hey
如您所见,虚拟模块中的函数已被跳过。如果我尝试在主进程中加载模块并记录它,那么该函数当然是对象的一部分。
最佳答案
您需要正确序列化和反序列化该函数。 JSON.stringify
忽略函数,可能是因为 json 是一种存储数据的格式,而不是脚本。
通过调用 toString()
来序列化该函数。然后您可以将其作为字符串发送。
完成({m: m.toString(), other: '嘿'})
将 m 转换为字符串会得到如下所示的结果:
“函数 m(){console.log(\'调用 m()\')}”
在接收端,您需要反序列化该函数。
var m = new Function("return "+ result.m)()
关于javascript - 为什么模块中的函数没有传回主进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46433786/