NodeJS VM2设置为'重定向'时访问控制台的正确方法

时间:2018-05-11 19:26:01

标签: node.js node-vm2

我使用VM2包来运行用户代码。我试图拦截控制台输出,并将NodeVM对象的控制台属性设置为“重定向”:

    // Create a new sandbox VM for this request
    const vm = new NodeVM( {
        console: 'redirect',
        timeout: 30000,
        sandbox: { request, state, response },
        require: {
            external: true
        }
    });

根据将控制台输出重定向到' events'的文档。我是NodeJS的新手,如何挂钩这些事件来捕获在沙盒中执行的console.log消息?

1 个答案:

答案 0 :(得分:2)

在深入挖掘源代码之后,我发现了事件发生的文件:

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。希望这能节省一些时间。