我试过
require('fs').writeFileSync('o.json', JSON.stringify(anObject));
进行调试,我得到RefrenceError: require is not defined.
这很奇怪。什么样的环境没有require
?
答案 0 :(得分:6)
在Node.js中,require
函数未在全局定义。当您需要一个模块时,它的源代码由一个带有多个参数的函数包装,require
就是其中之一:
(function (exports, require, module, __filename, __dirname) {/* your code */
});
当您查看任何源文件的内容时,您可以在Node Inspector中看到该包装器。
现在,有两种不同的方案可用于评估Node Inspector控制台中的代码:
调试过程正在运行。表达式在全局上下文中进行评估,即您只能访问全局定义的符号。 require
不在其中。
调试过程在断点处暂停。表达式在select堆栈框架的上下文中进行计算,并且还可以访问当前作用域中的所有变量(包括由外部函数通过闭包捕获的变量)。但是:大多数函数不会调用require
,因此在任何闭包中都不会捕获此变量,您无法访问它。
我与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