【问题标题】:nodejs - jade ReferenceError: process is not definednodejs-jade ReferenceError:未定义进程
【发布时间】:2013-07-22 15:38:20
【问题描述】:

项目由webstorm的express模板生成。

npm 依赖已安装!

我运行appplicaion的时候结果页面是OK的,但是控制台总是说:

'ReferenceError: process is not defined'

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

【问题讨论】:

  • 邮政编码sn-ps,请。
  • 每当我将“jade”模块加载到我的 node.js 中时,都会经过 13 秒,在此期间 [ReferenceError: process is not defined] 会打印 27 次。之后该模块按照宣传的方式工作。我在 xubuntu - 也是 webstorm 用户。 Jade 是版本 0.34.1 看起来 webstorm 是一个常见的因素。也许它运行带有狡猾参数的node.js..
  • 这个问题只出现在我的调试节点中。并且仅在通过 webstorm 运行我的应用程序时。这似乎是 webstorm node.js 调试集成的问题。此线程可能相关:devnet.jetbrains.com/thread/442598
  • 要查看问题,我只需要在我的 app.js 中添加以下代码: require('jade');返回;这是一个最小的例子吗? :)
  • 在 IntelliJ 中看到同样的问题;这是我正在使用的一个简单仓库的快照(Node/Express/Jade/Jquery):github.com/swarajban/soundNexus/tree/…

标签: node.js express pug


【解决方案1】:

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

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

这些是我使用与您相同的开发环境时的发现。 (win 64、webstorm、node等...)

从那里您可以使用 webstorms evaluate expression 重新运行该行代码并查看失败的确切原因。

【讨论】:

  • 这对我帮助很大。我仍然没有解决这个问题,但至少它是正确道路上的开始。感谢评估表达式提示。
  • 顺便说一句,我认为这不是“未定义进程”错误的根源。如果您因异常中断,您将始终在该行中断require() 调用,因为它会在尝试加载模块时检查许多不存在的路径。不幸的是,我认为这些例外对这个问题没有任何意义。但是,我确实设法在我的应用程序中将其缩小到 require('jade') 调用。我手动使用 Jade,所以我更容易将其缩小到 Jade。
【解决方案2】:

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

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

我已经在this pull request 中解决了这个问题。

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

[ReferenceError: 缓冲区未定义]

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

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

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

只有在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' }
    

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

我将分叉节点存储库,看看我是否可以改进这个功能和它的行为方式,然后也许我会提交一个拉取请求。至少我会为节点团队开一张票。

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

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

【讨论】:

    【解决方案3】:

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

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

    那个混乱的节点,我猜它认为当时还没有定义流程。

    将第二行更改为不同的变量名解决了问题

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-17
      • 2022-09-27
      • 2020-12-26
      相关资源
      最近更新 更多