Meteor Mongo Collection付款/插入已定义

时间:2015-09-29 02:22:13

标签: mongodb meteor reactjs paysimple

首先,我很抱歉我没有更多的描述这个,但它有点模糊不清的Meteor 1.2 bug。至少对我来说,因为我是新人。

基本上我正在创建一个单页内部网应用程序,它可以轮询paysimple.com API,将结果存储在MongoDB中,并让Meteor使用其反应魔法将新结果推送到页面。

起初我认为这与这个问题有关: Meteor, '/users/insert' is already defined

因为我使用的是“交易”这个词并认为我点击了关键字,但我重写了代码以使用“付款”这个词。

这是错误

W20150928-18:57:59.477(-7)? (STDERR)
W20150928-18:57:59.478(-7)? (STDERR) /Users/robert/.meteor/packages/meteor-tool/.1.1.8.1ywvo10++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:245
W20150928-18:57:59.478(-7)? (STDERR)                        throw(ex);
W20150928-18:57:59.478(-7)? (STDERR)                              ^
W20150928-18:57:59.548(-7)? (STDERR) Error: A method named '/payments/insert' is already defined
W20150928-18:57:59.548(-7)? (STDERR)     at livedata_server.js:1536:15
W20150928-18:57:59.548(-7)? (STDERR)     at Function._.each._.forEach (packages/underscore/underscore.js:113:1)
W20150928-18:57:59.548(-7)? (STDERR)     at [object Object]._.extend.methods (livedata_server.js:1532:7)
W20150928-18:57:59.548(-7)? (STDERR)     at [object Object].Mongo.Collection._defineMutationMethods (packages/mongo/collection.js:923:1)
W20150928-18:57:59.549(-7)? (STDERR)     at new Mongo.Collection (packages/mongo/collection.js:214:1)
W20150928-18:57:59.549(-7)? (STDERR)     at components/App.jsx:3:17
W20150928-18:57:59.549(-7)? (STDERR)     at /Users/robert/dev/paysimple-meteor/.meteor/local/build/programs/server/app/components/App.jsx:66:4
W20150928-18:57:59.549(-7)? (STDERR)     at /Users/robert/dev/paysimple-meteor/.meteor/local/build/programs/server/boot.js:242:10
W20150928-18:57:59.549(-7)? (STDERR)     at Array.forEach (native)
W20150928-18:57:59.549(-7)? (STDERR)     at Function._.each._.forEach (/Users/robert/.meteor/packages/meteor-tool/.1.1.8.1ywvo10++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/underscore/underscore.js:79:11)

该项目在github: https://github.com/rbaindourov/paysimple-meteor

2 个答案:

答案 0 :(得分:0)

通过查看错误消息,它听起来好像您实例化的同一个集合多于一个。或者可能定义一个干扰集合操作方法的服务器端方法。

我已经调查了你的代码,但不幸的是我无法调用外部API(我没有也无法获得Paysimple帐户 - 仅限美国居民),因此无法真正重现该行为。

当我在服务器代码(init.js)中简单地插入付款时,我没有收到错误。

我向任意页面发出了get请求,并且能够将结果存储到同一个集合中,而不会出错。

首先你的:

Payments.update( {Id:item.Id}, {$set:item}, {upsert:true} );
对我来说看起来有些陌生,但我已经测试了它,它按预期工作。我会做的:

Payments.upsert({Id: item.Id}, item);

我最后的猜测是,通过查看您的run脚本,这可能与您正在运行该应用的Mongo实例有关。

我会尝试删除外部MongoDB并使用集成的应用程序运行应用程序。只需省略MONGO_URL env变量声明。

祝你好运。

答案 1 :(得分:0)

这个bug本身已经消失了!排序。

Crenshinibon,你是对的,我确实有多个集合声明,一次在server/init.js,一次在components/App.jsx一次。

但是当我重构代码以获得/lib/collections.js时,错误仍然存​​在。这是我所有的预感一直受到流星缓存无效的主要问题。

直到我将Task.jsx重命名为LineItem.jsx并在整个应用程序中反映出错误消失后才发生变化。

这证实了某种类型的缓存机制可以让我的bug停留在一起,这可以通过之前的一些重构来解决。

因此,我并不确切知道哪些更改可以清除错误,更改集合名称或将其声明移动到一个全局lib文件。

我已经通知了流星团队: https://forums.meteor.com/t/meteor-clear-cache/10507

他们似乎同意这是一个问题。

再次感谢大家,对于在修复错误之前没有提交错误,我深表歉意。我疯狂地编写代码,它就消失了。