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

Gre*_*ngs 5 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
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ngs 12

在挖掘源代码后,我找到了发生事件发出的文件:

沙盒.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;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

监听这些事件所需要做的就是在您创建的虚拟机上绑定一个事件监听器:

// 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}`);
      });
Run Code Online (Sandbox Code Playgroud)

同样,您可以绑定到 console.log、console.info、console.warn、console.error、console.dir 和 console.trace。希望这会为其他人节省一些时间。