Я хотел бы запустить сторонний файл JavaScript (у меня нет большого контроля над его содержимым) в node и получить доступ к глобальной переменной, созданной этим файловым кодом в его контексте.
Есть две вещи, которые я рассмотрел:
-
Запуск кода в
vm
песочнице. Проблема в том, что я не знаю, как правильно создать контекст, потому чтоvm.createContext([sandbox])
не будет автоматически предоставлять основные вещи, такие какconsole
илиrequire
или что-то еще в script, который я хочу запустить.Это немного облом, потому что в документации явно указано (внимание мое):
Если задан объект песочницы, он будет "контекстуализировать" эту песочницу, чтобы ее можно было использовать в вызовах vm.runInContext() или script.runInContext(). Внутренние скрипты запускаются как таковые, песочница будет глобальным объектом, сохраняя все существующие свойства , но также имея встроенные объекты и функции любого стандартного глобального объекта.
Что такое "встроенные объекты и функции любого стандартного глобального объекта"? Я наивно полагаю, что это такие вещи, как
console
,process
,require
и т.д. Но если так, API не работает, потому что они не установлены. Возможно, я что-то не понимаю.var sandbox = vm.createContext({foo: 'foo'}); var code = 'console.log(foo);'; vm.runInContext(code, sandbox);
Результат:
evalmachine.:1
console.log(Foo);
^
ReferenceError: консоль не определена -
Выполнение кода в дочернем процессе . Но я не могу найти документацию о доступе к глобальным переменным дочерних процессов. Я предполагаю, что единственный способ общаться с дочерним процессом - это передача сообщения, но даже это кажется от родителя к ребенку, а не наоборот...
В принципе, я застрял. Halp.