Можно ли сделать все глобальные объекты Node.js доступными в контексте виртуальной машины Node?
Рассмотрим следующий код:
vm = require('vm');
context = vm.createContext({});
vm.runInContext("Buffer.from('abc').toString()", context);
Обратите внимание, что это производит ReferenceError: Buffer is not defined
поскольку Buffer - это специфическая конструкция Node.js, которую Node.js добавил как специфичный для узла глобальный объект. (Обратите внимание, что другие глобальные объекты JS, такие какMath
а также Array
не разделяйте эту проблему.) Эту конкретную проблему можно решить, изменив приведенный выше код на
vm = require('vm');
context = vm.createContext({Buffer});
vm.runInContext("Buffer.from('abc').toString()", context);
Однако, если я хочу, чтобы каждый глобальный объект, специфичный для конкретного узла, был импортирован, то создается впечатление, что я должен перечислить их один за другим. Учитывая, что Node.js добавляет глобальные объекты относительно часто, есть ли способ передать все глобальные объекты Node.JS в контекст vm? В качестве альтернативы, есть ли программный способ создать список всех глобальных узлов узлов?
Примечание: использование global
не согласуется с разными версиями узлов: например, Buffer
в global
для узлов v8 и v10, но не v12.
2 ответа
Я получил это.
const cloneGlobal = () => Object.defineProperties(
{...global},
Object.getOwnPropertyDescriptors(global)
)
Тест:
> const nG = cloneGlobal()
> nG.myVar = 'a';
'a'
> myVar
Uncaught ReferenceError: myVar is not defined
> 'myVar' in global
false
> 'myVar' in nG
true
> 'Buffer' in nG
true
Вся причина использования модуля «vm» заключается в том, чтобы изолировать контекст работающей программы от исполняемого кода.
Если вы хотите выполнить произвольный JavaScript внутри текущего контекста, вы можете просто использовать
eval
. Нет причин использовать vm.createContext.
eval("Buffer.from('abc').toString()");