nodejs - jade ReferenceError:未定义进程

时间:2013-07-23 13:59:17

标签: node.js express pug

该项目由webstorm的快速模板生成。

无法安装npm依赖项!

运行appplicaion时结果页面没问题,但控制台总是说:

'ReferenceError:进程未定义'

为什么会这样?我在Win7 64bit下。

3 个答案:

答案 0 :(得分:11)

我终于找到了问题的起源。它不是Jade或Express,它是Uglify-JS,它是transformers的依赖,它是Jade的依赖,它通常是express的依赖。

我在Windows 7和Windows 8(均为64位)的WebStorm IDE by JetBrains中遇到过此问题。

我已经继续并在this pull request中解决了问题。

我需要做的就是在节点vm上下文对象中包含process。在这之后我收到了一个新错误:

  

[ReferenceError:Buffer not defined]

我所要做的就是在vm上下文对象中包含Buffer,我不再收到那些愚蠢的消息。

我仍然不完全理解为什么它只是在调试期间发生但是在我非常有限的经历中我发现node vm module是一个善变的东西,或者至少是某些人的方式使用它是。

编辑:这是node vm module本身的错误。我想出了如何重现它,我想出了为什么它只在调试过程中发生。

如果您将第三个(文件)参数包含到vm.runInContext(code, context, file);,则只会发生此错误。所有关于此参数的文档都说它是可选的,仅用于堆栈跟踪。现在,你可以看到为什么它只在调试期间发生。然而,当你传递这个论点时,一些有趣的行为开始发生。

重现错误(请注意,文件参数必须传入或此错误永远不会发生):

  1. file参数必须以“.js”结尾,并且必须包含至少一个正斜杠或双反斜杠。由于这个参数应该是一个文件路径,因此这些参数的存在可能会触发其他一些功能。

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

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

    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' }
    

    将其指向实际文件将消除此错误。

  4. 我要分叉节点存储库,看看我是否可以改进这个函数及其行为方式,然后我可能会提交一个pull请求。至少我会为节点团队打开一张票。

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

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

答案 1 :(得分:1)

试试这个...... 设置webstorm调试器以中断所有未处理的异常。然后在调试模式下运行应用程序。我想你会发现[referenceError]是从引用的fs.js中抛出的。 更具体地说,fs.js第684行:

fs.statSync = function(path) {
  nullCheck(path);
  **return binding.stat(pathModule._makeLong(path));**
};

这些是我使用与您相同的开发环境的发现。 (赢64,webstorm,节点等......)

从那里你可以使用webstorms 评估表达式 来重新运行该行代码并查看你失败的确切原因。

答案 2 :(得分:0)

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

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

那个混乱的节点,我想那时候还没有定义过程。

将第二行更改为其他变量名称可以解决问题