javascript - 为什么模块中的函数没有传回主进程?

标签 javascript node.js child-process

我需要加载由第三方编写的不受信任的模块。我正在使用 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/

相关文章:

javascript - 如何处理 uiwebview 内的 Javascript onorientationchange 事件

javascript - LinkBut​​ton,如何防止用 "asp:LinkButton"双击?或在第一次点击后禁用 "asp:LinkButton"

angularjs - 用于 $http.get() 调用的 Node Express Cross Origin

node.js - Webpack javascript 堆内存不足 - 大量模块

c - 在 C 语言的基本 Shell 程序中,如何退出与父进程关联的所有进程?

linux - 你如何关闭一个Qt子进程并让子进程执行清理代码?

linux - 我如何让 Perl 等待在后台使用 system() 启动的子进程?

javascript - 如何在特定时间后自动运行 Ajax 请求?

javascript - 使用对象的 GraphQL 字段类型

mysql - 如果仅提供值,则检查唯一性 sequelize