node.js - 使用VM模块运行Node.js脚本: "ReferenceError: require is not a function"

标签 node.js virtual-machine require

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

因此,我找到了 VM 模块。我的第一个想法是,这将解决机器因子进程而困惑的问题,并使我的服务器更具可扩展性。

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

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

“ReferenceError:require 不是函数”

我后来了解到,这样做的原因是VM为脚本启动了一个裸露的V8执行环境,而不是一个独立的node.js执行环境。为了让我的想法发挥作用,我需要 VM 为我提供一个单独的、沙盒化的 Node.js 执行环境。我如何实现这一目标?

我的初步研究告诉我,我需要为 VM 执行环境提供其自己的 Node.js 全局变量的单独副本,以便 require 按预期运行。我刚才的理解正确吗?如果是这样,我需要采取哪些步骤来执行此任务?

最佳答案

My preliminary researches tell me that I need to provide the VM execution environment with its own separate copy of the node.js globals, so that require functions as intended

这对于 runInNewContext 是正确的,它不与“父”上下文共享全局变量(与 runInThisContext 相对)。

要在脚本中提供 require 的功能,您可以将其作为函数传递。其他本地程序也是如此,例如 console:

const vm = require('vm');

let sandbox = {
  require,
  console
};

vm.runInNewContext(`

let util = require('util');
console.log(util.inspect(util));

`, sandbox);

除了直接传递 require 之外,您还可以传递一个实现模块白名单的函数(这样您就可以控制允许脚本加载哪些模块)。

关于node.js - 使用VM模块运行Node.js脚本: "ReferenceError: require is not a function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235022/

相关文章:

node.js - 构建处理 MongoDB 查询的 Express 路由的最佳实践

node.js - 按名称的Mongodb请求呈现错误的数据

Azure 无法重新启动虚拟机 - NIC 未处于成功状态

linux -/dev/sda3 未在一个虚拟机中显示,但在另一虚拟机中显示相同的内容。

php - 在 PHP 的 require_once 中使用查询字符串

javascript - Node.js 将变量显示为 HTML

node.js - 无法连接到 MongoClient.connect 内的 Redis

ubuntu - certbot Failed authorization procedure 错误

ruby - 找不到 Mechanize gem 错误需要

php json-schema - fatal error : Class not found