请问大佬们child_process.spawn怎么运行动态js代码
需求是这样的,前端传过来动态代码,我要使用子进程运行,过滤错误,有错误提示前端,代码格式错误。 全部正确,保存到数据库。虽然这个寻求很不可思议,但是产品就这样要求的。
运行动态js代码也是nodejs代码,用来请求另一台服务器。我现在的模式是将js动态代码写成js文件 在child_process…execFile开启子进程去运行它,判断是否错误。
请问大佬们child_process.spawn怎么直接运行js动态代码,而不用文件形式
感激
4 回复
你可以看下vm
模块,node自己的require在文件第一次运行时,就是用的vm
A common use case is to run the code in a sandboxed environment
@soda-wy 好的,谢谢大佬,原来可以这样
楼上正解,使用vm模块运行。
const vm = require('vm');
const Context = require('@axetroy/context');
const context = new Context('./index.js');
const script = new vm.Script(`
const path = require('path');
console.log('current file is: ', __filename); // current/work/dir/index.js
console.log('current work dir:: ', process.cwd()); // current/work/dir
`);
script.runInNewContext(context);
但是这么做并不安全,你无法预测前端传过来的脚本是什么样子的。
所以有两个方案:
- vm模块的执行上下文,限制某些模块的引用。比如fs/process
- 使用babel把前端传过来的代码,生成ast树,去除掉一些危险的代码,再生成代码。
@axetroy 谢谢指点