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

Node.js 在Meteor.startup在Meteor应用程序的服务器端运行之前未加载在单独文件中声明的集合,node.js,coffeescript,meteor,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 "

我刚刚开始在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文件的顶部,它就可以工作


有什么问题吗?

您需要使用
@
将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中变量可见的第一位。在您的情况下,这会导致js中的
var
声明
RaceDays
,因此它们的作用域是文件


使用
@
char将变量绑定到
this
global
window
对象,从而取代此默认行为。

您需要使用
@
将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中变量可见的第一位。在您的情况下,这会导致js中的
var
声明
RaceDays
,因此它们的作用域是文件

使用
@
char将变量绑定到
this
global
window
对象,从而取代此默认行为