6

我试过了

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

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

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

4

4 回答 4

6

在 Node.js 中,该require函数不是全局定义的。当您需要一个模块时,它的源代码由一个函数包装,该函数接受多个参数并且require是其中之一:

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

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

现在有两种不同的场景可以从 Node Inspector 的控制台评估代码:

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

  2. 调试过程在断点处暂停。该表达式在选择堆栈帧的上下文中进行评估,并且可以访问当前范围内的所有变量(包括由外部函数的闭包捕获的变量)。但是:大多数函数不调用require,因此该变量不会在任何闭包中捕获,您也无法访问它。

我与一位 Node 核心开发人员进行了简短的交谈,讨论将 require 暴露为全局符号,因为它可以简化从 Node Inspector 注入代码,但我的论点不够有说服力。

于 2013-11-29T19:03:05.720 回答
2

可以在 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;'......巧合吗?

于 2014-01-27T04:18:26.497 回答
1

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

于 2014-03-17T16:32:15.867 回答
-1

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

> require
ReferenceError: require is not defined
于 2013-11-29T10:31:29.817 回答