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

Ole*_*leg 11 javascript node.js

我想在节点中运行第三方JavaScript文件(我对其内容没有太多控制权),并在其上下文中访问由该文件的代码创建的全局变量.

我考虑过两件事:

  1. 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);
    
    Run Code Online (Sandbox Code Playgroud)

    结果如下:

    evalmachine.:1
    console.log(foo);
    ^
    ReferenceError:未定义控制台

  2. 子进程中运行代码.但我找不到任何关于访问子进程的全局变量的文档.我假设与子进程通信的唯一方法是通过消息传递,但即使这似乎是从父对子,而不是反过来...

基本上,我被卡住了.HALP.

std*_*b-- 5

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

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);
Run Code Online (Sandbox Code Playgroud)