是否可以使所有 Node.js 全局变量在 Node 的 VM 上下文中可用?

Jac*_*lyk 6 node.js nodevm

考虑以下代码:

vm = require('vm');
context = vm.createContext({});
vm.runInContext("Buffer.from('abc').toString()", context);
Run Code Online (Sandbox Code Playgroud)

请注意,这会生成ReferenceError: Buffer is not definedBuffer ,它是 Node.js 特定的构造,Node.js 已将其添加为Node Specific Global Object(请注意,其他 JS 全局变量喜欢MathArray不存在此问题。) 可以通过将上述代码修改为

vm = require('vm');
context = vm.createContext({Buffer});
vm.runInContext("Buffer.from('abc').toString()", context);
Run Code Online (Sandbox Code Playgroud)

但是,如果我希望导入每个节点特定全局,那么似乎我必须将它们一一列出。鉴于 Node.js 相对频繁地添加 Global 对象,有没有办法可以将 Node.JS 的所有全局对象传递到 vm 上下文?或者,是否有一种编程方式来构造所有节点全局列表?

注意:global不同节点版本之间的使用不一致:例如,Buffer适用global于节点 v8 和 v10,但不适用于 v12。

小智 1

我懂了。


const cloneGlobal = () => Object.defineProperties(
    {...global},
    Object.getOwnPropertyDescriptors(global)
)

Run Code Online (Sandbox Code Playgroud)

测试:


const cloneGlobal = () => Object.defineProperties(
    {...global},
    Object.getOwnPropertyDescriptors(global)
)

Run Code Online (Sandbox Code Playgroud)

编辑:为作者的示例添加示例代码:

vm = require('vm');

const cloneGlobal = () => Object.defineProperties(
    {...global},
    Object.getOwnPropertyDescriptors(global)
)

context = vm.createContext(cloneGlobal());
const ret = vm.runInContext("Buffer.from('abc').toString()", context);

console.log(ret); // abc
Run Code Online (Sandbox Code Playgroud)