node.js - 是否可以在 Node 的 VM 上下文中提供所有 Node.js Globals?

标签 node.js nodevm

考虑以下代码:

vm = require('vm');
context = vm.createContext({});
vm.runInContext("Buffer.from('abc').toString()", context);

观察到这会产生 ReferenceError: Buffer is not defined因为 Buffer 是 Node.js 特定的构造,Node.js 已添加为 Node Specific Global Object . (请注意,其他 JS 全局变量,如 MathArray 不存在此问题。)可以通过将上述代码修改为
vm = require('vm');
context = vm.createContext({Buffer});
vm.runInContext("Buffer.from('abc').toString()", context);

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

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

最佳答案

我懂了。


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

测试:
> const nG = cloneGlobal()
> nG.myVar = 'a';
'a'
> myVar
Uncaught ReferenceError: myVar is not defined
> 'myVar' in global
false
> 'myVar' in nG
true
> 'Buffer' in nG
true

关于node.js - 是否可以在 Node 的 VM 上下文中提供所有 Node.js Globals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049140/

相关文章:

node.js - 结合 NodeJS Fiber + VM 沙盒

node.js - 如何获取Node vm2运行代码的结果

node.js - 如何在 Node mongodb游标上批量处理文档而不超时

node.js - 更换费太低

node.js - 如何修复 Mongoose 中的 'Cast to embedded failed for value'错误

node.js - Socket.io 的连接事件太多,有什么坏处吗?

javascript - 带 Promise 的 for 循环在 Node.js 中无法正常工作

javascript - NodeJS 虚拟机用例