Node.js - Jade参考错误:未定义进程

4

这个项目是由WebStorm的Express模板生成的。

npm依赖项已经安装!

当我运行应用程序时,结果页面正常,但控制台总是会显示:

'ReferenceError: process is not defined'

为什么会发生这种情况? 我使用的是Win7 64位操作系统。


1
请发布代码片段。 - Peter Lyons
每次我在node.js中加载“jade”模块时,会花费13秒的时间,期间[ReferenceError: process is not defined]被打印27次。之后该模块就像广告一样工作了。我在xubuntu上 - 同样是webstorm用户。Jade版本为0.34.1。看起来webstorm是一个共同因素。也许它使用不良的参数运行node.js... - LOAS
1
问题只在调试节点中出现,而且只有在通过WebStorm运行我的应用程序时才会出现。这似乎是WebStorm <-> Node.js调试集成的问题。这个线程可能与此相关:http://devnet.jetbrains.com/thread/442598 - LOAS
require('jade')的修复对我没起作用。[ReferenceError: process is not defined] 简言之,我无法使用WebStorm进行Node.js调试,普通的调试器可以用,但 WebStorm 不行 :( - Michael Draper
这不是一个修复。这只是一个最小化的示例,用于重现错误。如果这是一个修复,我会将其发布为答案。 :) - LOAS
显示剩余2条评论
3个回答

11
我终于找到了问题的根源。问题不在Jade或Express中,而是在Uglify-JS,它是transformers的依赖项,而后者常常是express的依赖项。
我在Windows 7和Windows 8(64位)上的JetBrains WebStorm IDE中遇到了这个问题。
我已经前往pull request中修复了这个问题。
我所需要做的就是在node vm上下文对象中包含process。在那之后,我收到了一个新错误:

[ReferenceError: Buffer is not defined]

我所需要做的就是在vm上下文对象中也包含Buffer,然后我就不再收到那些愚蠢的消息了。 我仍然不完全理解为什么它只会在调试期间发生,但在我的极其有限的经验中,我发现node vm模块是一个靠运气的东西,或者至少某些人使用它的方式是这样的。 编辑:这是node vm模块本身的一个错误。我找出了如何复现它,以及为什么只会在调试期间发生。
只有在vm.runInContext(code, context, file);的第三个(文件)参数中包含才会发生此错误。所有文档都说关于此参数仅为可选项,并且仅用于堆栈跟踪。一下子就能看出为什么它只会在调试期间发生。但是,当你传入此参数时会发生一些有趣的行为。
要复制此错误(请注意,文件参数必须被传递,否则根本不会发生此错误):
  1. 文件参数必须以".js"结尾,并且必须至少包含一个前斜杠或双反斜杠。由于预期该参数是文件路径,因此它包含这些内容可能触发其他功能。

  2. 您传递的代码(第一个参数)不能以函数开头。如果以函数开头,则不会发生错误。到目前为止,似乎以任何东西(除了函数)开头的代码都会生成引用错误。不要问我为什么这个参数会影响是否出现错误,因为我不知道。

  3. 您可以通过在传递给vm.createContext(contextObject);的上下文对象中包含process来修复该错误。

var context = vm.createContext({
    console: console,
    process: process
});
如果你的文件路径参数符合要求(符合#1中的要求),那么在上下文中包含process将消除错误消息;也就是说,除非你的文件路径没有指向一个实际的文件,否则你会看到以下内容:
{ [Error: ENOENT, no such file or directory 'c:\suatils.js']
  errno: 34,
  code: 'ENOENT',
  path: 'c:\\test.js',
  syscall: 'open' }

指向一个实际的文件将会解决这个错误。

我将fork node仓库,看看能否改进此函数和其行为方式,然后也许我会提交一个pull request。至少我会为node团队打开一个票。

编辑 2:我已确定这是WebStorm特有的问题。当WebStorm启动节点进程时,我们会遇到这个问题。如果从命令行调试,就没有问题。

视频:http://youtu.be/WkL9a-TVHNY?hd=1


1
尝试这个... 将WebStorm调试器设置为在所有未处理的异常上中断。然后在调试模式下运行应用程序。我认为你会发现[ReferenceError]是从引用的fs.js中抛出的。 更具体地说,是fs.js的第684行:
fs.statSync = function(path) {
  nullCheck(path);
  **return binding.stat(pathModule._makeLong(path));**
};

这是我在使用与你相同的开发环境(win 64,webstorm,node等)时得出的结果。
然后,您可以使用WebStorm的“评估表达式”重新运行该代码行,以查看失败原因。请注意保留HTML标签。

这对我帮助很大。虽然我还没有解决问题,但至少已经朝着正确的方向迈出了第一步。感谢您提供的评估表达式提示。 - Chev
顺便说一下,我不认为“process未定义”错误是从这里产生的。如果你在异常处中断,你总会在require()调用的那一行中断,因为它检查了许多不存在的路径,同时尝试加载模块。不幸的是,我不认为这些异常与此问题有任何关系。然而,我成功地将其缩小到我的应用程序中的require('jade')调用。我手动使用Jade,所以更容易将其缩小到Jade。 - Chev

0

我遇到了同样的错误,原因是我在文件顶部有以下内容:

const argv = require("minimist")(process.argv.slice(two));
const process = require("child_process");

那个混乱的节点,我猜它认为在那个时候还没有定义过进程。

将第二行改成不同的变量名解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接