为啥 Meteor 抱怨集合的插入方法已经定义?

Posted

技术标签:

【中文标题】为啥 Meteor 抱怨集合的插入方法已经定义?【英文标题】:Why does Meteor complain that an insert method for a collection is already defined?为什么 Meteor 抱怨集合的插入方法已经定义? 【发布时间】:2012-09-13 09:38:27 【问题描述】:

谁能告诉我为什么下面的代码会抛出以下错误? :

Error: A method named '/players/insert' is already defined 

我是 Meteor 和 coffeescript 的新手,所以我可能会忽略一些简单的东西。

这是我将排行榜示例移植到coffeescript:

###
Set up a collection to contain player information. On the server,
it is backed by a MongoDB collection named "players."
###
Players = new Meteor.Collection("players")

if Meteor.is_client
  Template.leaderboard.players = ->
    Players.find(, sort: score: -1, name: 1)

  Template.leaderboard.selected_name = ->
    player = Players.findOne(Session.get "selected_player")
    player and player.name

  Template.player.selected = -> if Session.equals("selected_player", this._id) then "selected" else ''

  Template.leaderboard.events = 
    'click input.inc': ->
      Players.update(Session.get("selected_player"), $inc: score: 5)
  

  Template.player.events = 
    'click': ->
      Session.set("selected_player", this._id)
  

# On server startup, create some players if the database is empty.
if Meteor.is_server
  Meteor.startup ->
    if Players.find().count() is 0
      names = [
                "Ada Lovelace"
                "Grace Hopper"
                "Marie Curie"
                "Carl Friedrich Gauss"
                "Nikola Tesla"
                "Claude Shannon"
              ]
      Players.insert(name: name, score: Math.floor(Math.random()*10)*5) for name in names

完整的堆栈跟踪如下:

[[[[[ ~/dev/meteor/leaderboard ]]]]]

Running on: http://localhost:3000/

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: A method named '/players/insert' is already defined
    at app/packages/livedata/livedata_server.js:744:15
    at Function.<anonymous> (app/packages/underscore/underscore.js:84:24)
    at [object Object].methods (app/packages/livedata/livedata_server.js:742:7)
    at new <anonymous> (app/packages/mongo-livedata/collection.js:111:13)
    at app/leaderboard.js:4:11
    at /Users/alex/dev/meteor/leaderboard/.meteor/local/build/server/server.js:109:21
    at Array.forEach (native)
    at Function.<anonymous> (/Users/alex/dev/meteor/leaderboard/.meteor/local/build/server/underscore.js:76:11)
    at /Users/alex/dev/meteor/leaderboard/.meteor/local/build/server/server.js:95:7
Exited with code: 1

我正在运行 Meteor 版本 0.4.0 (8f4045c1b9)

提前感谢您的帮助!

【问题讨论】:

是否可以在某处发布您的完整项目?我认为您的问题是两次定义集合..也许您还没有删除原始 .js 文件? 【参考方案1】:

如果您复制文件,无论使用咖啡脚本还是纯 javascript,您也会收到此错误。例如,将源文件复制到名为 Backup 的子目录会产生此错误,因为 Meteor 会合并子目录中的文件。

【讨论】:

谢谢,这解决了我的一天。我有一个错误配置的 SublimeText 插件,它在 .coffee 上的每个保存操作都会生成 .js 文件。因此我得到了重复的客户端和服务器文件。 谢谢,为我节省了大量时间。【参考方案2】:

这似乎是 coffeelint 的配置问题(使用 npm 全局安装)。

我最初安装 coffeelint 是为了检查我的咖啡脚本代码是否正确且没有错误。

我按照说明安装了 coffeelint:

sudo npm install -g coffeelint

coffeeint 在单独运行 .coffee 文件时运行良好。

但是,当运行任何添加了 coffeescript 包的 Meteor 项目时,我得到了上述错误。

一时兴起,我认为错误可能是由于与我现有的节点安装冲突。

我决定先卸载 Coffeelint:

sudo npm uninstall -g coffeelint

然后删除之前meteor生成的leaderboard.js文件。

重新启动流星后,上面的咖啡脚本示例按预期工作,没有错误。

【讨论】:

“然后删除了之前meteor生成的leaderboard.js文件”——正如其他人所说,这个错误是由Meteor两次实例化同一个集合引起的。【参考方案3】:

尝试移动(即复制和删除原件)

Players = new Meteor.Collection("players")

一次低于if Meteor.is_client 还有一次低于if Meteor.is_server

我不知道确切原因,因为我也是 Meteor 的新手,但这对我有用,我认为服务器端需要它自己的参考,以及客户端, 虽然在范围之外声明应该做同样的事情(可能是一个错误,记住它们仍然是 0.5.0 preview ,这让我觉得你可能想升级并尝试一些新版本的新智能包,看起来你'正在使用 0.4),但是当我的服务器中的文件无法识别任何内容时,我定义了流星的根目录(将这些文件推送到客户端和服务器),我定义了服务器自己的引用,我得到了同样的错误,直到我移动引用的“公共”声明以给服务器和客户端各自提供自己的副本,但没有任何效果。

希望对您有所帮助...

【讨论】:

感谢 Jay - 我发现了问题的根源并回答了我自己的问题。问题是由于与已安装的 coffeelint 版本发生冲突(请参阅下面的详细信息)。

以上是关于为啥 Meteor 抱怨集合的插入方法已经定义?的主要内容,如果未能解决你的问题,请参考以下文章

插入新对象时 Meteor 0.8.2 客户端集合为空

Meteor - 构建和使用集合

为啥我的内存卡插到电脑上已经显示有H要复制东西的时候却还是提醒我插入H啊?

为啥没有定义 Meteor 模板对象?

在WORD2007中插入页码显示不了是为啥

Mongo在Meteor Server上插入后如何等待观察者调用