gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:50:04 25 4
gpt4 key购买 nike

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

根据将控制台输出重定向到“事件”的文档。我是 NodeJS 新手,如何 Hook 这些事件以捕获在沙箱内执行的 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;
}
};
}

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

// 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}`);
});

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

关于node.js - NodeJS VM2 设置为 'redirect' 时访问控制台的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50299007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com