在Meteor.startup在Meteor应用程序中运行服务器端之前,未在单独文件中声明的集合

时间:2013-09-17 13:00:49

标签: node.js coffeescript meteor

我刚开始在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文件的顶部,那就可以了。

可能出现什么问题?

1 个答案:

答案 0 :(得分: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中的第一个位置,其中变量是可见的。在您的情况下,这会导致RaceDays在js中由var声明,因此它们的范围限定为文件。

使用@ char通过将变量绑定到thisglobalwindow对象来取代此默认行为。