NodeJS VM2 правильный способ доступа к консоли, когда установлено «перенаправление» - PullRequest
0 голосов
/ 11 мая 2018

Я использую пакет VM2 для запуска кода пользователя. Я пытаюсь перехватить вывод консоли и установил свойство консоли объекта 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 Ответ

0 голосов
/ 14 мая 2018

После копания в исходном коде я нашел этот файл, в котором происходит событие 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.Надеюсь, это сэкономит кому-то еще время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...