Как получить значение в контексте узла vm.Получение значений из модуля ядра Vode
Если я создаю контекст и запускаю скрипт в нем, я использую util.inspect([[context]])
?
И если я это сделаю, он вернется в сериализацию?
по какой-то причине, когда я util.inspect("null")
он возвращается с '\'null'\'
знает любой почему, а также то, что лучший способ, чтобы получить значения из контекста запуска в модуле узлов Vm?
Я также сделал несколько микро-тестов, и кажется, что создание нового контекста происходит намного медленнее, чем запуск его в thisContext
. Также, когда я избавляюсь от тайм-аута, похоже, он работает намного быстрее.
Поэтому я хотел бы использовать этот контекст, не используя глобальные переменные, чтобы не вызвать утечку, а также попытаться ускорить выполнение этого.
Контекст этого кода заключается в том, что я пытаюсь добавить в песочницу катастрофическое регулярное выражение.
global.mapperContext = {
result: false
};
const scriptString = `
global.mapperContext.result = true;
if ("${string}".match(${regex})) {
global.mapperContext.result = false;
}
`;
const vmScript = new vm.script(scriptString);
try {
vmScript.runInThisContext({ timeout: 1000 });
} catch (e) {
// Do something with error
}
// This works but I dont like attaching things to the global object.
// I could cause memory leaks...
console.log(global.mapperContext);
const mapperContext = { result };
const scriptString = `
(function IIFE() {
result = true;
if ("${string}".match(${regex})) {
result = false;
}
})()
`;
const sandbox = vm.createContext(mapperContext);
const script = new vm.script(scriptString);
script.runInContext(script, sandbox, {timeout: 1000});
// This result is serialized and is hard to parse.
util.inspect(sandbox.result);
Можете ли вы предоставить простой (код) пример того, чего вы пытаетесь достичь? – mscdex
@mscdex Я обновил билет. –