在Node.js中,如何从vm2返回Promise?

问题描述 投票:0回答:1

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

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

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

异步代码

这是我想要转换为字符串并使用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变量未定义。

javascript node.js assert node-vm2
1个回答
0
投票

NodeVM.run()执行代码,并返回通过执行创建的模块,然后可由主机代码访问。为了在处理后的代码中访问计算结果,应将其分配给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。然后可以导出导出的promise,也可以等待导出解析的值。

© www.soinside.com 2019 - 2024. All rights reserved.