【发布时间】:2016-04-26 10:11:42
【问题描述】:
我想在 node 中运行第三方 JavaScript 文件(我对其内容没有太多控制权)并访问由该文件的代码在其上下文中创建的全局变量。
我考虑过两件事:
-
在
vm沙箱中运行代码。问题是我不知道如何正确创建上下文,因为vm.createContext([sandbox])不会自动为我想要的脚本提供console或require等基本内容运行。这有点令人失望,因为文档明确指出(强调我的):
如果给定沙箱对象,将“上下文化”该沙箱,以便在调用 vm.runInContext() 或 script.runInContext() 时使用它。在这样运行的脚本内部,沙箱将成为全局对象,保留其所有现有属性但也具有任何标准全局对象所具有的内置对象和功能。
什么是“任何标准全局对象所具有的内置对象和函数”?我天真地假设它是
console、process、require等。但如果是这样,API 就不起作用,因为这些都没有设置。我可能在这里误解了一些东西。var sandbox = vm.createContext({foo: 'foo'}); var code = 'console.log(foo);'; vm.runInContext(code, sandbox);结果:
evalmachine.:1
控制台.log(foo);
^
ReferenceError: 未定义控制台 在child process 中运行代码。但我找不到任何有关访问子进程全局变量的文档。我假设与子进程通信的唯一方法是通过消息传递,但即使这样似乎也是从父进程到子进程,而不是相反...
基本上,我被困住了。停下来。
【问题讨论】:
-
@dandavis 任何类型(可序列化)。
-
child_process.exec(command[, options][, callback])的回调将输出提供给 stdOut 缓冲区,因此如果您的子进程console.logs(strJSON),您可以在回调中取回它。其他的好方法很复杂,但是你可以很简单地使用 HTTP 或临时文件来完成一些任务......“IPC” -
@dandavis 我已经考虑过了,但是代码可能会自己记录日志,我宁愿不干涉。
标签: javascript node.js