Как получить результат кода, который запускается Node vm2
Недавно я пытался реализовать выполнение песочницы, используя пакет vm2, который был опубликован @Patrik Šimek
Я пытаюсь запустить некоторый код JS, который я считаю, что это пользовательская логика, я храню эту логику в строковой переменной.
Мне нужно выполнить эту пользовательскую логику в среде песочницы (так как это ненадежный код) и получить ответ в реальной среде, чтобы продолжить нормальный поток приложения на основе этого результата.
Я попробовал несколько методов, чтобы получить конечный результат. Пользовательская логика успешно выполняется внутри песочницы, но я не могу найти способ отправить этот результат обратно в основной процесс, но вместо этого я получаю результат как неопределенный. Поэтому пока ничего не получалось.
Надеюсь, я получу некоторые ответы здесь.
Пользовательская логика (которая будет храниться внутри строки)
function addValues(a,b){
var c = a + b;
console.log('Addition of 2 values');
console.log(c);
return c;
}
addValues(10,10); // function call
Фактическая реализация
// vm2
const {NodeVM} = require('vm2');
const vm = new NodeVM({
console: 'inherit',
sandbox: {},
require: {
external: true,
builtin: ['fs','path'],
root: "./",
mock: {
fs: {
readFileSync() { return 'Nice try!';}
}
},
wrapper : ""
}
});
// Sandbox function
let functionInSandbox = vm.run("module.exports = function(customLogic){
customLogic //need to execute this custom logic
});
// Make a call to execute untrusty code by passing it as an argument
// to sandbox environment and obtain the result
var resultOfSandbox = functionInSandbox(customLogic);
console.log("Result of Sandbox :");
console.log(resultOfSandbox); // undefined (need to get the result of custom logic execution)
2 ответа
Вам нужно определить переменную песочницы. Объявите пустой объект, добавьте его в ваш параметр песочницы и в вашем скрипте добавьте еще одно свойство к вашему объекту. Я думаю, что фрагмент кода будет говорить сам за себя:
const c = `
function addValues(a,b){
var c = a + b;
console.log('Addition of 2 values');
console.log(c);
return c;
}
// we'll define ext as a sandbox variable, so it will be available
ext.exports = addValues(10,10); // function call
`;
let ext = {};
const { NodeVM } = require( 'vm2' );
const vm = new NodeVM( {
console: 'inherit',
// pass our declared ext variable to the sandbox
sandbox: { ext },
require: {
external: true,
builtin: ['fs', 'path'],
root: './',
},
} );
// run your code and see the results in ext
vm.run( c, 'vm.js' );
console.log( ext );
Этот код работает:
let result = {};
code='output.testOut=1;';
const vm = new VM({
timeout: 1000,
allowAsync: false,
sandbox: { ...data, output: result },
});
const script = new VMScript(code);
const r = vm.run(script);
console.log(result);