1

我刚刚开始在 Mac 上使用 Meteor。我做了一个简单的应用程序,在服务器目录中有两个 .coffee 文件:bootstrap.coffee 和 publish.coffee。

bootstrap.coffee 的内容是这样开始的:

Meteor.startup ->
  if RaceDays.find().count() is 0

等等。

publish.coffee 的内容是:

RaceDays = new Meteor.Collection("racedays")

Meteor.publish "racedays", ->
  RaceDays.find()

问题是当我使用 meteor 命令运行应用程序时,出现以下错误:

20130917-15:42:00.967(1)? (STDERR /Users/gnidde/Projects/test/.meteor/local/build/programs/server/boot.js:184
W20130917-15:42:00.970(1)? (STDERR) }).run();
W20130917-15:42:00.971(1)? (STDERR)    ^
W20130917-15:42:00.979(1)? (STDERR) ReferenceError: RaceDays is not defined
W20130917-15:42:00.980(1)? (STDERR)     at server/q.coffee:3:5
W20130917-15:42:00.981(1)? (STDERR)     at mains (/Users/gnidde/Projects/test/.meteor/local/build/programs/server/boot.js:157:61)
W20130917-15:42:00.981(1)? (STDERR)     at Array.forEach (native)
W20130917-15:42:00.982(1)? (STDERR)     at Function._.each._.forEach (/Users/gnidde/.meteor/tools/3cba50c44a/lib/node_modules/underscore/underscore.js:79:11)
W20130917-15:42:00.984(1)? (STDERR)     at /Users/gnidde/Projects/test/.meteor/local/build/programs/server/boot.js:157:5

似乎 Meteor.startup 是在加载 publish.coffee 文件之前运行的,但如果我正确理解了文档,情况就不应该如此。我也尝试将其更改为使用 .js 文件,但没有区别。

如果我删除 publish.coffee 文件并将代码放在 bootstrap.coffee 文件的顶部,它就可以工作。

有什么问题?

4

1 回答 1

1

您需要将 coffeescript 变量声明为全局变量@

@RaceDays = new Meteor.Collection("racedays");

这是由于 Meteor 变量阴影如何与 coffeescript 自动变量声明一起工作。

在 Meteor 中的普通 Javascript 中,用声明的变量var绑定到声明它们的文件:

var LocalRaceDays = ...; // this is visible only in the file it's defined

RaceDays = ...; // this is visible everywhere

显然,所有集合都应该以第二种方式定义。

但是,默认情况下,coffeescript 自己执行“智能”变量声明 - 基本上是通过将var variableName变量放在变量可见的 javascript 中的第一个位置。在您的情况下,这会导致在 jsRaceDays中声明var,因此它们的范围仅限于文件。

使用@char 通过将变量绑定到this,globalwindowobject 来取代此默认行为。

于 2013-09-17T13:35:59.830 回答