“require”未在node-inspector的repl的控制台选项卡中定义

时间:2013-11-29 10:25:43

标签: node.js node-inspector

我试过

require('fs').writeFileSync('o.json', JSON.stringify(anObject));

进行调试,我得到RefrenceError: require is not defined.

这很奇怪。什么样的环境没有require

4 个答案:

答案 0 :(得分:6)

在Node.js中,require函数未在全局定义。当您需要一个模块时,它的源代码由一个带有多个参数的函数包装,require就是其中之一:

(function (exports, require, module, __filename, __dirname) {/* your code */
});

当您查看任何源文件的内容时,您可以在Node Inspector中看到该包装器。

现在,有两种不同的方案可用于评估Node Inspector控制台中的代码:

  1. 调试过程正在运行。表达式在全局上下文中进行评估,即您只能访问全局定义的符号。 require不在其中。

  2. 调试过程在断点处暂停。表达式在select堆栈框架的上下文中进行计算,并且还可以访问当前作用域中的所有变量(包括由外部函数通过闭包捕获的变量)。但是:大多数函数不会调用require,因此在任何闭包中都不会捕获此变量,您无法访问它。

  3. 我与Node核心开发人员进行了一次简短的聊天,讨论将require作为全局符号公开,因为它可以简化从Node Inspector注入的代码,但我的论点不够令人信服。

答案 1 :(得分:2)

可以在节点检查器中使用require,方法是点击“require”在范围内的断点(使用NodeJS v0.10.25测试,node-inspector@0.7。 0-2):

示例(节点的超简单2字节'REPL'):创建一个仅包含的文件(例如r.js):

0;

然后使用

$ node --debug-brk r.js

以通常的方式启动node-inspector和浏览器,

- 或 - (使用NPM中的node-debug模块)使用:

$ node-debug r.js

现在切换到浏览器中的node-inspector控制台并确认require确实已定义,然后对其执行某些操作,例如:

> typeof require;
"function"
> fs = require('fs');
undefined
> fs.writeFileSync('bla.txt', 'blup');
undefined

并验证此文件是否已写入您启动节点的目录中。

注意:node-inspector的浏览器部分可能非常麻烦:当一个接一个地调试不同的脚本时,我经常需要刷新(导致调试器断开连接),然后重新启动Node,直到脚本在浏览器中正确显示

P.S。这种方法与创建Perl'REPL'有着惊人的相似之处,可以将其作为perl -de '0;'运行...巧合?

答案 2 :(得分:1)

FWIW,只需从node-debug _mocha开始,在断点处停止并在右侧面板中选择调用堆栈中的最低帧,我就进入了require()可用的上下文:{ {1}}工作正常,但require('fs')和其他已安装的模块没有,即使我指定了绝对路径。如果我遇到解决方案,我们会回来。

答案 3 :(得分:-1)

require()在所有CommonJS environments中实现,其中包括Node.js,但不在浏览器的控制台中实现,这是node-inspector所基于的(具体来说,Blink Developer)工具):

> require
ReferenceError: require is not defined