ReferenceError,流星

时间:2014-06-09 18:50:33

标签: meteor referenceerror

我已经看到这个问题已经发布但是并没有真正理解这些解释。我是meteor的新手,正在做这个项目。根据我的理解,浏览器中没有节点的某些功能,但我不确定如何解决问题。我试图在一些函数(窗口)中包装代码,但仍然无法使其工作。我也试过使用npm,但是因为一些非法令牌的错误而空洞。谢谢你的帮助。

您的应用崩溃了。这是最新的日志。

/home/alex/TacticsTrainer2/.meteor/local/build/programs/server/boot.js:186
}).run();
   ^
ReferenceError: window is not defined
    at app/js/bootstrap.min.js:6:353
    at app/js/bootstrap.min.js:8:3
    at /home/alex/TacticsTrainer2/.meteor/local/build/programs/server/boot.js:155:10
    at Array.forEach (native)
    at Function._.each._.forEach (/home/alex/.meteor/tools/5bf1690853/lib/node_modules    /underscore/underscore.js:79:11)
    at /home/alex/TacticsTrainer2/.meteor/local/build/programs/server/boot.js:82:5
=> Exited with code: 8
=> Your application is crashing. Waiting for file change.

3 个答案:

答案 0 :(得分:1)

看起来您可能没有正确构建您的应用。您的代码旨在在服务器端运行的客户端/浏览器端运行。

在你的应用中:

  • 将所有代码放在/ client目录中的客户端上
  • 将所有服务器端代码放在/ server目录中
  • 将您要在根文件夹中的服务器和客户端上运行的代码或非保留名称(公共,私有,测试,服务器或客户端)

有关详细信息,请参阅meteor docs:http://docs.meteor.com/#structuringyourapp

答案 1 :(得分:0)

ReferenceError是Node错误。 Meteor是Node之上的框架。

Node具有全局范围(又名Node的global变量)。 如果您尝试访问未定义的全局变量,则Node(而不是Meteor)会抛出此错误。

浏览器还有一个名为window的全局范围,并且在访问未定义的变量时不会抛出ReferenceErrors。

这是我喜欢为类添加功能的模式(它是非常流星):

/lib/Helpers.js      <-- Helpers for everyone (node+browser)
/server/Helpers.js   <-- Server helpers (node)
/client/Helpers.js   <-- Client helpers (browser)

考虑以下实施:

// /lib/Helpers.js
Helpers = {/* functions */};  // Assigned to window.Helpers and global.Helpers

// /server/Helpers.js
Helpers = _.extend(Helpers, {/*more functions*/}

// /client/Helpers.js
Helpers = _.extend(Helpers, {/*more functions*/}

这是一个微不足道的例子。如果我不想担心加载顺序怎么办?为什么不在/lib/Helpers.js中使用_.extend()?

// /lib/Helpers.js
// Helpers = {/* functions */};                  // Overwrites...
Helpers = _.extend(Helpers, {/* functions */});  // ReferenceError

因为如果未定义Helpers,您将从Node获取ReferenceError - 特别是用作参数的“Helpers”。 (Node知道将Helpers指定为global.Helpers)。

以下两种“修复”方法:

1)将助手分配给某事

// /lib/Helpers.js
if (typeof Helpers === 'undefined') Helpers = {};
Helpers = _.extend(Helpers, {/* functions */});

2)使用全球

中的助手
// /lib/Helpers.js
Helpers = _.extend(global.Helpers, {/* functions */});  // works in node, but...

两者都很糟糕。

1)语法太可怕了   2)在节点中工作,但浏览器中没有全局。所以它没有达到目的。

所以我放弃了,并在lib中第一次重写它,并在任何被覆盖的情况下寻找运行时错误。

如果你有一个方便的跨浏览器语法,请做评论: - )

答案 2 :(得分:-1)

我认为您正在调用在客户端和服务器上加载的方法。

您可以在Meteor.method中编写代码,如下所示:

if (!this.isSimulation) {
    // code with node js that should only run in the server
} else {
    // code that doesn't have nodejs runtime (browser)
}

当您在客户端和服务器中加载Method时会发生这种情况。