我使用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消息?
答案 0 :(得分:2)
在深入挖掘源代码之后,我发现了事件发生的文件:
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。希望这能节省一些时间。