使用VM模块运行Node.js脚本:“ReferenceError:require不是函数”

我正在编写我自己的自定义node.js服务器。 它现在处理静态页面,AJAX GET,POST和OPTIONS请求(后者用于CORS),但是我知道我select用于运行服务器端GET和POST脚本的方法并不是最优的 – 官方node.js文档指出,启动大量的子Node.js过程是一个坏主意,因为这是一个资源饥饿的方法。 它工作,但我知道,可能有更好的方法来达到相同的结果。

所以,我下了VM模块。 我首先想到的是,这将解决使用subprocess混淆机器的问题,并使我的服务器更具可扩展性。

有一个小问题。 我的服务器端脚本,用于目录列表和将结果发送回浏览器等任务,从几个require语句开始加载所需的模块。

最后编写代码来读取脚本文件,并将其传递给vm.Script(),我现在遇到一个错误:

“ReferenceError:要求不是一个函数”

我从那里得知,其原因是VM为脚本启动了一个纯粹的V8执行环境,而不是一个独立的node.js执行环境。 为了使我的想法有效,我需要VM为我提供一个单独的,沙箱化的node.js执行环境。 我如何做到这一点?

我的初步研究告诉我,我需要为虚拟机执行环境提供自己独立的node.js全局副本,以便按照预期的方式执行function。 我的理解是否正确? 如果是这样,我需要采取哪些步骤来执行此任务?

我的初步研究告诉我,我需要为虚拟机执行环境提供自己独立的node.js全局副本,因此需要按照预期

runInNewContext是正确的,它不与“父”上下文共享全局variables(与runInThisContext )。

为了在脚本中提供所需的function,可以将其作为函数传递。 对于其他当地人来说也是一样:

 const vm = require('vm'); let sandbox = { require, console }; vm.runInNewContext(` let util = require('util'); console.log(util.inspect(util)); `, sandbox); 

你可以通过一个函数来实现模块白名单(这样你就可以控制脚本允许加载的模块),而不是直接传递require