Что касается модуля "vm" в node.js, каков наилучший подход к созданию и запуску скриптов в нескольких "vm"? Моя цель - создать несколько "vm" и иметь возможность запускать скрипты в каждом из них одновременно.
Некоторые конкретные вопросы, на которые я не смог найти ответы:
Я считаю, что ответы там, но поскольку "vm" является таким чрезмерным термином, мне было трудно найти много полезной информации.
Для вашего случая использования лучше использовать
child_process.fork()
из сценариев запуска node.js в vm, не считается хорошей практикой и очень сложно обеспечить безопасность.у child_process уже установлен механизм обратного вызова, поэтому вы можете легко назначить обработчики при завершении.
Чтобы ответить на ваши вопросы, я сделал небольшой сценарий:
const vm = require('vm');
const sandbox = {
cb: (err, data) => {
if (err) console.log(err);
console.log(data);
},
};
const code = '
function test() {
cb(null, 'from vm');
}
test();
';
process.nextTick(() => {
console.log('from event loop');
});
vm.runInNewContext(code, sandbox);
Результаты скриптов:
from vm
from event loop
Что дало мне следующие выводы:
Каждый "vm" работает в своем потоке (или как отдельный процесс)?
Нет, vm работает синхронно. если он выполнял асинхронный процесс, следующий тик подталкивает console.log()
перед очередью libuv, поэтому мы сначала получаем from event loop
и from vm
second.
Поддерживается ли механизм обратного вызова, поэтому скрипт может позволить вызывающему коду узнать, что он сделал и т.д.?
На самом деле он не поддерживается изначально, но вы можете писать код так, как я делал с callback
в песочнице, единственным общим состоянием между vm
и вашим кодом является global
переменная.