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

NodeJS VM2 proper way to access console when set to 'redirect'

我正在使用 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
        }
    });

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

在深入研究源代码后,我发现了这个事件发生的文件:

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。希望这会为其他人节省一些时间。