NodeJS VM2 правильный способ доступа к консоли, когда установлено "перенаправление"
Я использую пакет VM2 для запуска кода пользователя. Я пытаюсь перехватить вывод консоли и установил свойство console объекта NodeVM в значение redirect:
// Create a new sandbox VM for this request
const vm = new NodeVM( {
console: 'redirect',
timeout: 30000,
sandbox: { request, state, response },
require: {
external: true
}
});
Согласно документации, которая перенаправляет вывод консоли на "события". Я новичок в NodeJS, как мне подключиться к этим событиям, чтобы перехватить сообщения console.log, выполненные внутри Песочницы?
1 ответ
Решение
Покопавшись в исходном коде, я нашел этот файл, где происходит событие emit:
if (vm.options.console === 'inherit') {
global.console = Contextify.readonly(host.console);
} else if (vm.options.console === 'redirect') {
global.console = {
log(...args) {
vm.emit('console.log', ...Decontextify.arguments(args));
return null;
},
info(...args) {
vm.emit('console.info', ...Decontextify.arguments(args));
return null;
},
warn(...args) {
vm.emit('console.warn', ...Decontextify.arguments(args));
return null;
},
error(...args) {
vm.emit('console.error', ...Decontextify.arguments(args));
return null;
},
dir(...args) {
vm.emit('console.dir', ...Decontextify.arguments(args));
return null;
},
time: () => {},
timeEnd: () => {},
trace(...args) {
vm.emit('console.trace', ...Decontextify.arguments(args));
return null;
}
};
}
Все, что вам нужно сделать, чтобы прослушать эти события, это привязать прослушиватель событий к виртуальной машине, которую вы создали:
// Create a new sandbox VM for this request
const vm = new NodeVM( {
console: 'redirect',
require: {
external: ['request']
}
});
vm.on('console.log', (data) => {
console.log(`VM stdout: ${data}`);
});
Кроме того, вы можете привязать к console.log, console.info, console.warn, console.error, console.dir и console.trace. Надеюсь, это сэкономит кому-то еще время.