Ole*_*leg 11 javascript node.js
我想在节点中运行第三方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);
Run Code Online (Sandbox Code Playgroud)
结果如下:
evalmachine.:1
console.log(foo);
^
ReferenceError:未定义控制台
在子进程中运行代码.但我找不到任何关于访问子进程的全局变量的文档.我假设与子进程通信的唯一方法是通过消息传递,但即使这似乎是从父对子,而不是反过来...
基本上,我被卡住了.HALP.
您可以为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)
归档时间: |
|
查看次数: |
1451 次 |
最近记录: |