Можно ли сделать все глобальные объекты 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()");
Другие вопросы по тегам