我试过了
require('fs').writeFileSync('o.json', JSON.stringify(anObject));
进行调试,我得到了RefrenceError: require is not defined.
这很奇怪。没有什么样的环境require
?
我试过了
require('fs').writeFileSync('o.json', JSON.stringify(anObject));
进行调试,我得到了RefrenceError: require is not defined.
这很奇怪。没有什么样的环境require
?
在 Node.js 中,该require
函数不是全局定义的。当您需要一个模块时,它的源代码由一个函数包装,该函数接受多个参数并且require
是其中之一:
(function (exports, require, module, __filename, __dirname) {/* your code */
});
当您查看任何源文件的内容时,您可以在 Node Inspector 中看到该包装器。
现在有两种不同的场景可以从 Node Inspector 的控制台评估代码:
调试的进程正在运行。表达式在全局上下文中进行评估,即您只能访问全局定义的符号。require
不在其中。
调试过程在断点处暂停。该表达式在选择堆栈帧的上下文中进行评估,并且可以访问当前范围内的所有变量(包括由外部函数的闭包捕获的变量)。但是:大多数函数不调用require
,因此该变量不会在任何闭包中捕获,您也无法访问它。
我与一位 Node 核心开发人员进行了简短的交谈,讨论将 require 暴露为全局符号,因为它可以简化从 Node Inspector 注入代码,但我的论点不够有说服力。
可以在 node-inspector中使用,方法是require
在“require”范围内打断点(使用 NodeJS v0.10.25 测试,node-inspector@0.7.0-2):
一个例子(一个超级简单的 2 字节 'REPL' 用于 Node):创建一个文件(例如r.js
),其中只包含:
0;
然后使用
$ node --debug-brk r.js
并以通常的方式启动节点检查器和浏览器,
- 或 - (使用 NPM 中的节点调试模块)使用:
$ node-debug r.js
现在切换到浏览器中的节点检查器控制台并验证require
确实已定义,然后对其执行一些操作,例如:
> typeof require;
"function"
> fs = require('fs');
undefined
> fs.writeFileSync('bla.txt', 'blup');
undefined
并验证此文件是否已写入您启动节点的目录中。
注意:node-inspector 的浏览器部分可能会出问题:当一个接一个地调试不同的脚本时,我经常需要刷新(导致调试器断开连接),然后重新启动 Node,直到脚本在浏览器中正确显示。
PS 这种方法与通过运行它来创建 Perl 'REPL' 有着惊人的相似之处perl -de '0;'
......巧合吗?
FWIW,只需从 开始node-debug _mocha
,在断点处停止并在右侧面板中选择调用堆栈上的最低帧,我就得到了一个require()
可用的上下文:require('fs')
工作正常,但require('q')
其他安装的模块没有,即使我指定了一个绝对路径。如果我遇到解决方案,我会回来。
require()
在所有CommonJS 环境中实现,包括 Node.js,但不在浏览器的控制台中实现,这node-inspector
是基于(具体来说,Blink 开发者工具):
> require
ReferenceError: require is not defined