Javascript 在Node.js中,如何从vm2返回承诺?
我有一些异步JavaScript代码,我想使用vm2/NodeVM运行这些代码 代码测试两个函数:用户提交的函数Javascript 在Node.js中,如何从vm2返回承诺?,javascript,node.js,assert,node-vm2,Javascript,Node.js,Assert,Node Vm2,我有一些异步JavaScript代码,我想使用vm2/NodeVM运行这些代码 代码测试两个函数:用户提交的函数偶数和奇数和使用节点内置的断言库预定义的函数解决方案 我的问题是,我如何从vm.run()中获得我已解决的承诺 连续代码 这是我想转换成字符串并使用vm2运行的测试代码: const assert = require('assert'); function evenAndOdd(arr) { return [arr.filter(el => el % 2 === 0).so
偶数和奇数
和使用节点内置的断言
库预定义的函数解决方案
我的问题是,我如何从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);
};
})
}
})
}
虚拟机vm
code
我的问题是,如何从vm.run()
现在,上面的结果
变量尚未定义 NodeVM.run()
执行代码并返回由执行创建的模块,然后主机代码可以访问该模块。为了在处理后的代码中访问计算结果,应将其分配给模块.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
保存沙盒脚本生成的承诺。导出的承诺可以访问或等待访问解析的值
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');
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));