javascript - 在沙箱中执行代码,模块在相同的上下文中

标签 javascript node.js

我正在自动运行 ECMA-402 test suite针对我编写的 Intl polyfill,我遇到了一些问题。目前,测试是针对库的完整版本运行的,这意味着每次进行更改时都必须重新编译才能运行测试。我试图通过将代码拆分为单独的模块并使用 require 来运行测试来改进它。

当我尝试使用 vm 模块运行测试时,主要问题就出现了。如果我将 polyfill 添加到测试的沙箱中,一些测试会在检查 native 行为时失败——例如,polyfill 的对象不会从测试上下文的 Object.prototype 继承。将 require 传递给测试将不起作用,因为模块仍在父上下文中编译和执行。

在我看来最简单的解决方案是生成一个新的 Node 进程并将代码写入进程的 stdin,但是生成的 node 进程不执行代码写入它并永远等待。这是我试过的代码:

function runTest(testPath, cb) {
    var test,
        err = '',
        content = 'var IntlPolyfill = require("' + LIB_PATH + '");\n';

    content += LIBS.fs.readFileSync(LIBS.path.resolve(TEST_DIR, testPath)).toString();
    content += 'runner();';

    test = LIBS.spawn(process.execPath, process.execArgv);
    test.stdin.write(content, 'utf8');

    // cb runs the next test
    test.on('exit', cb);
}

有没有人知道为什么 Node.js 不执行写入其 stdin 流的代码,或者如果有其他方法我可以让模块在与测试相同的上下文中编译?

最佳答案

您必须关闭子进程的标准输入才能使用数据并退出。完成代码传递后执行此操作。

test.stdin.end();

关于javascript - 在沙箱中执行代码,模块在相同的上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932876/

相关文章:

node.js - 如何使用 node.js、Express 和 knox 将文件从浏览器上传到 Amazon S3?

javascript - 使用输入数据减去文件类型创建新的 formData

javascript - 滚动捕捉到页面部分

javascript - 如何将分组的 TextField 值设置为状态?

javascript - 文件和文件夹的 Node.js 项目命名约定

node.js - 使用 AWS JavaScript SDK 和 agent=false 进行快速 S3 操作

javascript - 在 page.evaluate 中等待 page.waitFor ?

javascript - 无法使用 ImageMagick Node.js 调整图像大小

javascript - 动态创建的li点击事件不起作用jquery

javascript - 读取 REST POST 响应 node.js