请问大佬们child_process.spawn怎么运行动态js代码
发布于 6 年前 作者 1316346949 2655 次浏览 来自 问答

需求是这样的,前端传过来动态代码,我要使用子进程运行,过滤错误,有错误提示前端,代码格式错误。 全部正确,保存到数据库。虽然这个寻求很不可思议,但是产品就这样要求的。

运行动态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);

但是这么做并不安全,你无法预测前端传过来的脚本是什么样子的。

所以有两个方案:

  1. vm模块的执行上下文,限制某些模块的引用。比如fs/process
  2. 使用babel把前端传过来的代码,生成ast树,去除掉一些危险的代码,再生成代码。

@axetroy 谢谢指点

回到顶部