我试图在沙箱中运行用户提交的脚本来处理一些数据,然后通过 node-fetch 通过 http 请求将输出发送到指定的端点。但是,我不确定我是否做得正确,即使在阅读了 VM2 的文档之后,我也不能完全确定我需要配置哪些选项。
这是一个示例,我调用 process(); inputData 为{ a: 123 }
,userScript 将是下图所示的 sampleScript.js。
process(inputData, userScript) {
const { NodeVM } = require('vm2');
const vm = new NodeVM({
console: 'inherit',
sandbox: { content: inputData },
require: { external: true },
wrapper: 'none',
});
console.log(vm.run(userScript, 'node_modules'));
}
sampleScript.js
input = content;
function execute(data) {
data['a'] *= 100;
const fetch = require('node-fetch');
await fetch(`webhook.site-endpoint`, {
method: 'POST',
body: JSON.stringify(data),
});
}
execute(input);
我应该期待指定端点上的消息“12300”。但是,await fetch 方法调用似乎有问题,因为我在控制台上收到此错误:
(节点:36376)UnhandledPromiseRejectionWarning:错误:在 TCPConnectWrap.afterConnect [as oncomplete] 处连接 ECONNREFUSED 127.0.0.1:80(net.js:1141:16)(节点:36376)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志
--unhandled-rejections=strict
(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。
这可能只是我配置沙箱选项的方式,因为我不确定我是否首先成功导入了 node-fetch 库。任何意见,将不胜感激!