4

该项目由 webstorm 的 express 模板生成。

npm 依赖项已安装!

当我运行应用程序时,结果页面是好的,但控制台总是会说:

'ReferenceError:未定义进程'

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

4

3 回答 3

11

我终于找到了问题的根源。它不是 Jade 或 Express,它是Uglify-JS,它是转换器的依赖项,它是 Jade 的依赖项,通常是 express 的依赖项。

我在 Windows 7 和 Windows 8(均为 64 位)上的 JetBrains 的 WebStorm IDE中遇到了这个问题。

我已经着手解决了这个拉取请求中的问题。

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

[ReferenceError:缓冲区未定义]

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

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

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

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

要重现错误(请注意,必须传入文件参数,否则根本不会发生此错误):

  1. 文件参数必须以“.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' }
    

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

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

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

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

于 2013-09-24T01:09:10.997 回答
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评估表达式重新运行该行代码,并准确查看失败的原因。

于 2013-08-29T01:32:00.347 回答
0

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

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

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

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

于 2019-07-25T08:51:58.367 回答