执行 Function 对象时出现 Node "ReferenceError: require is not defined"。

3

我正在尝试执行一个函数对象,它与以下伪代码基本相同:

var testF = new Function("x","y", "var http = require('http');");
testF('foo','bar');

并获得:

ReferenceError: require is not defined

我需要在Node中添加一些东西来重新加载要求的模块吗?如果需要,因为它不是全局模块,所以谷歌并没有给出帮助。如果有的话,请提供如何实现的指针。

感谢您的建议。

2个回答

8

由于new Function是eval的一种形式,因此您可以直接使用eval

eval("function testF(x,y){ console.log(require);}");
testF(1,2);

如果您想遵循原始方法,您需要将这些全局变量传递到函数作用域中:
var testF = new Function(
  'exports',
  'require',
  'module',
  '__filename',
  '__dirname',
  "return function(x,y){console.log(x+y);console.log(require);}"
  )(exports,require,module,__filename,__dirname);

testF(1,2); 

我本来不想使用eval,所以我将重构代码,采用另一种动态生成函数的技术。你非常有帮助的答案指引了我另外的方向。 - Scott Graph

3

使用同样调用Function构造函数的方法,另一种可能的解决方案:

var testF = new Function("x","y", "var require = global.require || global.process.mainModule.constructor._load; var http = require('http');");
testF('foo','bar');

谢谢,这让我发现了我们 API 服务器中的一个安全漏洞。 - Erdogan Kurtur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接