2015-02-07 45 views
1

我正在嘗試實現簡單的功能,以允許Meteor應用程序檢查某個MongoDB字符串是否可以成功用於連接。爲了做到這一點,我有一個事件觸發了一個服務器方法,該方法建立到MongoDB的連接並返回集合內的文檔數量。 我正在使用的(簡化)方法使用了mongo連接字符串和集合名稱,並返回集合中文檔的數量。我如何取消註冊流星收藏?

var mongoUrl = "mongodb://user:[email protected]:27017/mydb"; 
var collectionName = "test"; 

Meteor.methods({ 
    testDbConnection: function(mongoUrl, collectionName) { 
    var database = new MongoInternals.RemoteCollectionDriver(mongoUrl); 
    TestCollection = new Mongo.Collection(collectionName, { _driver: database }); 
    var numberOfDocs = TestCollection.find().count(); 
    // HELP: how to unregister TestCollection? 
    return numberOfDocs; 
    } 
}); 

方法的第一次調用工作,但因爲我還沒有註冊的TestCollection所有後續調用失敗,因爲流星已經有定義的test集合的insert方法。

Exception while invoking method 'testDbConnection' Error: A method named '/test/insert' is already defined 
     at packages/ddp/livedata_server.js:1444:1 
     at Function._.each._.forEach (packages/underscore/underscore.js:113:1) 
     at [object Object]._.extend.methods (packages/ddp/livedata_server.js:1442:1) 
     at [object Object].Mongo.Collection._defineMutationMethods (packages/mongo/collection.js:886:1) 
     at new Mongo.Collection (packages/mongo/collection.js:208:1) 
     at [object Object].Meteor.methods.testDbConnection (app/app.js:55:24) 
     at maybeAuditArgumentChecks (packages/ddp/livedata_server.js:1599:1) 
     at packages/ddp/livedata_server.js:648:1 
     at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
     at packages/ddp/livedata_server.js:647:1 

如何註銷流星中的集合以執行這些特定數據庫連接?

+1

既然創建一個'Collection'不僅僅提供了一個接口到mongo集合,那麼對於那些簡單的即席查詢,使用'MongoInternals'還是使用npm'mongodb'你最好嗎? – MasterAM 2015-02-07 15:18:11

+0

事實上,它確實很好地使用了 'var numberOfDocs = database.open(collectionName).find()。count();'但對我來說問題依然存在。 – Stephan 2015-02-07 15:39:29

回答

1

雖然我沒有回答你的直接問題,但我有一個想法可能有助於你的追求!

我會考慮使用「工作者」方法,這是您的Meteor應用程序執行單個任務並死亡。那麼你不必擔心清理。

  • 如果使用Velocity,您可以啓動一個「自毀鏡像」。你可以啓動它like this並殺死鏡像like this

  • 您仍然可以使用,如果你不使用速度從你的主應用程序派生一個child_process上述相同的方法來啓動.meteor/.../build/main.js

你可以告訴你的應用程序是在工作模式下通過傳遞child_process一個環境變量。注意:自從我們(速度團隊)爲鏡像做了這個之後,我一直在考慮編寫一個Meteor工作包來完成上述工作。

+0

有趣的是,謝謝薩姆。會給它一個嘗試:) – Stephan 2015-02-09 13:52:41