CNode

请问大佬们child_process.spawn怎么运行动态js代码

问答
11316346949发布于9 年前最后回复9 年前4 回复3623 浏览0 收藏

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

运行动态js代码也是nodejs代码,用来请求另一台服务器。我现在的模式是将js动态代码写成js文件 在child_process..execFile开启子进程去运行它,判断是否错误。

请问大佬们child_process.spawn怎么直接运行js动态代码,而不用文件形式

感激

查看回复

回复 (4)

S
sodawy#1·9 年前

你可以看下vm模块,node自己的require在文件第一次运行时,就是用的vm

A common use case is to run the code in a sandboxed environment

A
axetroy#3·9 年前

楼上正解,使用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树,去除掉一些危险的代码,再生成代码。
参与回复
登录后即可参与回复。登录