【问题标题】:Meteor Collection exists in Mongo but returns ReferenceError in browser consoleMeteor Collection 存在于 Mongo 中,但在浏览器控制台中返回 ReferenceError
【发布时间】:2016-06-06 03:04:42
【问题描述】:

我正在设置一个新的 Meteor 项目,但在客户端处理集合时遇到了问题。现在我正在构建的是一个管理页面,用户可以在其中维护学校列表。

在终端中运行 meteor mongodb.schools.find() 会返回一个 BSON 对象,正如我所期望的那样,但是当我在 Chrome 控制台中输入“学校”时,它会返回 Uncaught ReferenceError: Schools is not defined,这很糟糕。

我的项目架构(简化为引用 School 集合的位)如下:

client/
  layouts/
    admin/
      schools.coffee
      schools.jade
  lib/
    subscriptions.coffee
lib/
  collections.coffee
server/
  lib/
    publications.coffee

每个文件的内容(按理想的加载顺序)是:

1) lib/collections.coffee

 1| Schools = new Mongo.Collection('schools')

2) server/lib/publications.coffee

 1| Meteor.publish('schools'), ->
 2|   Schools.find()

3) client/lib/subscriptions.coffee

 1| Meteor.subscribe('schools')

4) client/layouts/admin/schools.coffee

76| Template.admin_schools.helpers
77|   schools: ->
78|     Schools.find()
79|   numSchools: ->
80|     Schools.find().count()
81|   hasSchools: ->
82|     Schools.find().count() > 0

5) client/layouts/admin/schools.jade

 4| h2.admin__header Schools
 5|   span.admin__record-count {{numSchools}} entries
...
22| table.admin__list
23|   if hasSchools
24|     each schools
25|       tr.admin__list-item
26|         td #{name}

我还有一个新集合条目的表单,它调用Schools.insert,但错误是一样的。

当页面加载时,我收到以下错误(可能是因为它首先被调用):

debug.js:41 Exception in template helper: ReferenceError: Schools is not defined
at Object.Template.admin_schools.helpers.numSchools

这两个错误,再加上我知道集合中存在一个条目这一事实,让我相信问题在于客户端对集合存在的认识。

这种差异可能是由于加载顺序(我很确定我通过将重要文件放在lib/ 目录中来解决这个问题,尽管我希望有第二个意见),或者可能是由于拼写/语法错误(尽管没有编译错误令人费解)。也许是完全不同的东西!

非常感谢您的时间和帮助,非常感谢他们。

【问题讨论】:

  • docs.meteor.com/#/full/structuringyourapp 的文档中,检查“文件加载顺序”部分,该部分说客户端/lib 将在/lib 之前加载。对我们有用的一种方法是在包中添加集合并导出它们(将首先加载包)。
  • 一个简单的测试是在比其他文件夹最深的 lib 文件夹内有一个 lib 文件夹。 /lib/someFolder/lib/collections.coffee 之类的东西。如果这可行,那么它将首先加载最深的 lib 文件夹。
  • @Kishor 我现在有lib/one/two/lib/collections.coffee(4 深)、lib/one/two/lib/permissions.coffee(4 深)、server/one/lib/publications.coffee(3 深)和client/lib/subscriptions.coffee(2 深),很遗憾我是仍然在页面加载时遇到与以前相同的错误。我肯定会研究包装选项,尽管这似乎比我想要的要复杂一些。除非我遗漏了什么,否则如果根 lib/ 目录的目的是为客户端和服务器端准备东西,这不应该更容易协商吗?
  • 我明白了。这很奇怪。是的,它应该很简单。根据您的错误,client/layouts/admin/schools.coffee 在 lib/collections.coffee 之前加载,这不应该是这种情况。
  • Meteor.subscribe('schools') 调用现在在 onCreated 函数中,server/one/lib/publications.coffee 已被删除。当这不起作用时,我还将lib/.../collections.coffee 行放入Meteor.startup 函数中,但那里也没有骰子。这很棘手!非常感谢你的帮助。我会继续四处寻找,看看会发生什么。

标签: mongodb meteor collections coffeescript referenceerror


【解决方案1】:

原来,因为这是 CoffeeScript,所以在 lib/collections.coffee 中的 Schools = new Mongo.Collection('schools') 之前放置一个 @ 会使 Schools 成为全局变量,从而解决问题!最后很简单的修复:)

特别感谢 Kishor 帮助解决问题。

【讨论】:

  • 很高兴知道该问题已解决。接受这是一个答案,我认为它不仅可以帮助他人,还可以增加自己的声望点。 :)
【解决方案2】:

您是否在创建时检查过您的订阅?

【讨论】:

  • 您的回答不是答案,而是问题。因此,对这个问题发表评论可能会更好。 :)
猜你喜欢
  • 2019-09-22
  • 2021-08-26
  • 2019-06-25
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2011-07-29
相关资源
最近更新 更多