当然可以,Node.js 更适合做这种“根据 URL 动态执行脚本”的服务,下面我给你写一个完整示例:
目标功能(Node.js):
访问 http://localhost:3000/test.js;
自动加载 ./test.js 文件;
执行它(支持 console.log、函数、导出);
将结果返回给前端。
Node.js 服务器代码:server.js
const http = require('http'); const fs = require('fs'); const vm = require('vm'); const path = require('path'); const url = require('url'); const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url); const pathname = decodeURIComponent(parsedUrl.pathname); // 只允许访问 .js 文件 if (pathname.endsWith('.js')) { const filepath = path.join(__dirname, pathname); if (fs.existsSync(filepath)) { try { const code = fs.readFileSync(filepath, 'utf-8'); const sandbox = { console: { log: (...args) => sandbox.output.push(args.join(' ')) }, output: [] }; vm.createContext(sandbox); // 创建沙箱环境 vm.runInContext(code, sandbox); const output = sandbox.output.join('\n'); res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(output || '[no output]'); } catch (err) { res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end(`Execution error:\n${err.stack}`); } } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Script not found.'); } } else { res.writeHead(403, { 'Content-Type': 'text/plain' }); res.end('Only .js files are allowed.'); } }); server.listen(3000, () => { console.log('Server running at http://localhost:3000/'); });
示例脚本:test.js
console.log("Hello from test.js"); console.log("2 + 3 =", 2 + 3);
✅ 使用方式:
node server.js
然后访问:
http://localhost:3000/test.js
你会看到浏览器返回内容:
Hello from test.js 2 + 3 = 5
注意事项:
支持 console.log | ✅ |
支持函数逻辑 | ✅ |
安全性 | ❌ 沙箱简单,不适合公网使用 |
可支持 POST/参数 |
网友回复 我知道答案,我要回答
私活外包
![]() ![]() ![]() ![]() ![]() |