在模块内的节点全局范围中的Eval代码

时间:2017-04-21 19:35:58

标签: javascript node.js scope eval

常规:在node.js中,如何访问正在执行的文件的范围?

示例:我有一个模块(mod.js)和一个需要它的文件(main.js)。从mod.js中我需要做一个eval()来访问main.js的范围,如下所示:

mod.js:

exports.runCode = function(code) {
  var x = 1;
  // do some stuff to x and code
  return eval(code) + x;
}

main.js:

var amod = require('./mod');

var func = function(a,b) {
  return a + b;
}

console.log(amod.runCode('2+2'));    // works fine
console.log(amod.runCode('func()')); // ReferenceError: func is not defined

击:

$ node main

到目前为止,我尝试使用node的global,vm和process对象,以及各种闭包

另请注意,我只能控制mod.js,而不是main.js(是的,我知道安全隐患)

2 个答案:

答案 0 :(得分:1)

根据rednoyz的反馈,我意识到执行的范围是函数“define”而不是模块。所以这是一个修复它的新版本的定义。

exports.define = function(__code) {
   eval.call(module, __code);
}

我还测试了以避免我在上一篇文章中犯下的一些错误。

var amod = require('./mod');

amod.define("var f=function(a,b) {return a + b;}");
amod.define("var g=function(a,b) {return a*b;}");

console.log(amod.runCode('2+2'));    // works fine - 5
console.log(amod.runCode('f(2,3)')); // works fine - 6
console.log(amod.runCode('g(3,4)')); // works fine - 13

答案 1 :(得分:0)

不幸的是,您必须在模块本身的模块中定义要使用的函数,您可以编写一个新函数将这些函数注入模块的范围,

exports.define = function(__code) {
   eval(__code);
}

使用新的定义界面

amod.define('func = function(a,b) {
  return a + b;
}');

您还可以使用其他模式,例如将所有函数定义定义为对象并将其传递给模块以获取访问权限,或者您可以使用@idbehold建议的全局范围

如果您破解了跨两个模块共享范围的方法,请与我们分享。