在 Node.js 中,我如何 return 来自 vm2 的 Promise?

In Node.js, how can I return a Promise from vm2?

我有一些异步 JavaScript 代码,我想 运行 使用 vm2 / NodeVM。

该代码测试了两个函数:用户提交的函数 evenAndOdd 和使用 Node 内置 assert 库的预定义函数 solution

我的问题是,如何从 vm.run() 中获得已解决的 Promise?

异步代码

这是我想用vm2转成字符串和运行的测试代码:

const assert = require('assert');

function evenAndOdd(arr) {
  return [arr.filter(el => el % 2 === 0).sort(), arr.filter(el => el % 2 === 1).sort()];
};

function solution(arr) {
  return [arr.filter(el => el % 2 === 0).sort(), arr.filter(el => el % 2 === 1).sort()];
};

const runTest = async () => {

  return new Promise((resolve, reject) => {

    const map = new Map();
    const tests = 10;

    for (let i = 0; i < tests; i++) {

      let randLength = parseInt(Math.random() * 19 + 1);
      let randArray = [...Array(randLength)].map(e => ~~(Math.random() * randLength));

      const test = async () => {
        return assert.deepEqual(evenAndOdd(randArray), solution(randArray));
      }

      const description = "TEST CASE: evenAndOdd([" + randArray + "}]) EXPECT: [[" + solution(randArray)[0] + "], [" + solution(randArray)[1] + "]] GOT: [[" + evenAndOdd(randArray)[0] + "], [" + evenAndOdd(randArray)[1] + "]]";

      test()
        .then(() => {
          map.set(description, true);
          if (map.size === tests) {
            resolve(map);
          };
        })
        .catch(() => {
          map.set(description, false);
          if (map.size === tests) {
            resolve(map);
          };
        })
    }
  })
}

如果我追加以下代码,我就会得到我想要记录到控制台的内容:

runTest().then((result) => {
  console.log(result)
});

vm代码

我的问题是,如何从 vm.run() 获得已解决的承诺?

const { NodeVM } = require('vm2');

  const vm = new NodeVM({
    console: 'inherit',
    sandbox: {},
    require: {
      external: true,
      builtin: ['assert'],
      import: ['assert'],
      root: "./",
    },
  });

const result = vm.run(stringifiedJavaScript, 'vm.js');

目前,上面的 result 变量未定义。

NodeVM.run() 执行代码和 returns 执行创建的模块,然后可以由主机代码访问。为了在处理后的代码中访问计算结果,您应该将其分配给 module.exports.

考虑以下示例:

const {NodeVM} = require("vm2");
const vm = new NodeVM();

const vmExports = vm.run('module.exports.pr = Promise.resolve(42);');

vmExports.pr.then(x => console.log(x));

变量vmExports保存了run调用导出的模块,字段vmExports.pr保存了沙盒脚本产生的promise。导出的承诺然后可用或可以等待以访问已解析的值。