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:

sandbox.js

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. Надеюсь, это сэкономит кому-то еще время.

Другие вопросы по тегам