在 vm 脚本上下文中传递函数
Pass functions in a vm script context
假设我有一个如下所示的库模块:
module.exports = {
increment: function() {
count++;
}
}
我想在动态生成的脚本中使用它,如下所示:
(function() { lib.increment(); })();
通过将其传递到沙箱中:
var sandbox = {
count: 1
lib: require('./lib')
}
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
我 运行 遇到的明显问题是,一方面我不能要求 "lib" 因为 "count" 没有在 lib.js 中定义;另一方面,如果我在 "lib.js" 文件的导出之上定义 var count
,这个新的 count
变量将受到影响,而不是沙盒中的变量。
以下是我要遵守的限制条件:
- 在生成的文件上使用 vm 而不是 eval() 或 require()
- 在外部文件中定义了"lib"
- 没有修改自动生成的脚本,所以没有使用
lib.increment.apply(context)
或类似的
到目前为止我找到的唯一解决方案是在生成的脚本中将 lib
函数作为字符串添加到前面,或者直接在 sandbox
对象上定义它们,我发现是一个不太理想的选择。
似乎没有任何方法可以在 require
调用中传递变量上下文。
实现此目的的一种方法是让您的 lib
模块成为一个接受上下文然后 returns 正确接口的函数。
lib.js
module.exports = function(context) {
var count = context.count;
return {
increment: function() {
count++;
}
};
};
main.js
var sandbox = {
count: 1
};
sandbox.lib = require('./lib')(sandbox);
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
假设我有一个如下所示的库模块:
module.exports = {
increment: function() {
count++;
}
}
我想在动态生成的脚本中使用它,如下所示:
(function() { lib.increment(); })();
通过将其传递到沙箱中:
var sandbox = {
count: 1
lib: require('./lib')
}
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
我 运行 遇到的明显问题是,一方面我不能要求 "lib" 因为 "count" 没有在 lib.js 中定义;另一方面,如果我在 "lib.js" 文件的导出之上定义 var count
,这个新的 count
变量将受到影响,而不是沙盒中的变量。
以下是我要遵守的限制条件:
- 在生成的文件上使用 vm 而不是 eval() 或 require()
- 在外部文件中定义了"lib"
- 没有修改自动生成的脚本,所以没有使用
lib.increment.apply(context)
或类似的
到目前为止我找到的唯一解决方案是在生成的脚本中将 lib
函数作为字符串添加到前面,或者直接在 sandbox
对象上定义它们,我发现是一个不太理想的选择。
似乎没有任何方法可以在 require
调用中传递变量上下文。
实现此目的的一种方法是让您的 lib
模块成为一个接受上下文然后 returns 正确接口的函数。
lib.js
module.exports = function(context) {
var count = context.count;
return {
increment: function() {
count++;
}
};
};
main.js
var sandbox = {
count: 1
};
sandbox.lib = require('./lib')(sandbox);
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);