为什么模块中的函数不能传递回主进程?

我需要加载由第三方编写的不受信任的模块。 我正在使用vm作为沙箱,我正在考虑使用threads (来自npm: here ),以便asynchronous加载模块并避免阻塞代码。

我已经把代码剥离到了最低限度,因为我被困住了,而且我不明白是不是我想要达到的目标是不可能的,或者只是我在与示波器混淆。

这是一个虚拟模块:

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

logging的输出是:

 { val: 5 } hey 

如您所见,虚拟模块中的function已被跳过。 如果我尝试在主进程中加载​​模块并logging它,那么该函数当然是对象的一部分。

您需要正确序列化和反序列化函数。 JSON.stringify忽略函数,可能是因为json是存储数据的格式,而不是脚本。

通过调用toString()对函数进行序列化。 然后你可以把它作为一个string发送。

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

将m转换为string会给你这样的东西:

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

在接收端,您需要反序列化函数。

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