在单独的上下文中运行js代码并访问其全局variables

我想在节点上运行一个第三方的JavaScript文件(我对它的内容没有太多的控制),并且在其上下文中访问由该文件的代码创build的全局variables。

有两件事我考虑过了:

  1. vm沙盒中运行代码。 问题是,我不知道如何正确地创build上下文,因为vm.createContext([sandbox])不会自动提供基本的东西,如consolerequire或任何我想运行的脚本。

    这有点令人失望,因为文档明确指出(强调我的):

    如果给定一个沙箱对象,将“调解”该沙箱,以便可以在调用vm.runInContext()或script.runInContext()时使用它。 内部脚本就像这样运行,沙箱将是全局对象,保留所有现有属性, 但也具有任何标准全局对象所具有的内置对象和函数

    什么是“任何标准全局对象的内置对象和函数” ? 我天真地认为它是像consoleprocessrequire等东西。但如果是这样,API不起作用,因为这些都没有设置。 我可能在这里误解了一些东西。

     var sandbox = vm.createContext({foo: 'foo'}); var code = 'console.log(foo);'; vm.runInContext(code, sandbox); 

    其结果是:

    evalmachine.:1
    的console.log(FOO);
    ^
    ReferenceError:控制台没有定义

  2. 在subprocess中运行代码。 但是我找不到有关访问subprocess的全局variables的任何文档。 我假设与subprocess沟通的唯一方法是通过消息传递,但即使这似乎是从父母到孩子,而不是相反…

基本上,我卡住了。 HALP。

       

网上收集的解决方案 "在单独的上下文中运行js代码并访问其全局variables"

您可以使用高级vm /沙箱为Node.js

 var VM = require('vm2').NodeVM; // https://github.com/patriksimek/vm2#nodevm var options = { console: 'inherit', sandbox: { foo: 'foo' } } vm = new VM(options); var code = ` console.log(foo); oldFoo = foo; foo = Math.random(); `; vm.run(code); console.log(vm.context.oldFoo, vm.context.foo); 

如何将父级的console传递到上下文中?

 const vm = require('vm'); var sandbox = { console: console }; var context = new vm.createContext(sandbox); var script = new vm.Script('console.log("foo")'); script.runInContext(context);