【问题标题】:Node "ReferenceError: require is not defined" when executing a Function object执行 Function 对象时节点“ReferenceError:require is not defined”
【发布时间】:2014-04-29 14:42:16
【问题描述】:

我正在尝试执行一个与以下伪代码基本相同的 Function 对象:

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

得到:

ReferenceError: require is not defined

我是否需要添加一些东西来重新加载 require 模块,因为它不是 Node 中的全局模块?如果是这样,谷歌不是我的朋友,所以任何关于如何这样做的指针都会很棒。

感谢您的想法。

【问题讨论】:

    标签: node.js function require


    【解决方案1】:

    既然new Function is a form of eval你可以eval它:

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

    如果你想遵循原来的方法,你需要将那些 globals 传递给函数作用域:

    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,因此我将使用另一种技术进行重构以动态生成函数。您非常有帮助的回答帮助我指出了另一个方向
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,这让我在我们的 API 服务器中找到了一个安全漏洞。
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2015-08-11
    相关资源
    最近更新 更多