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 消息?
在深入研究源代码后,我发现了这个事件发生的文件:
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。希望这会为其他人节省一些时间。
我正在使用 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 消息?
在深入研究源代码后,我发现了这个事件发生的文件:
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。希望这会为其他人节省一些时间。