我如何在 Meteor 中注销一个集合?
How can I unregister a Collection in Meteor?
我正在尝试实现简单的功能以允许 Meteor 应用程序检查某个 MongoDB 字符串是否可以成功用于连接。为此,我有一个事件触发一个服务器方法,该方法建立与 MongoDB 和 returns 集合中文档数量的连接。
我使用的(简化)方法采用 mongo 连接字符串和集合名称以及 returns 集合中的文档数。
var mongoUrl = "mongodb://user:password@192.168.0.98: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
所有后续调用都失败了,因为 Meteor 已经为 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
如何在 Meteor 中注销集合以执行这些临时数据库连接?
虽然我没有得到您直接问题的答案,但我有一个想法可能会对您的探索有所帮助!
我会考虑使用 "worker" 方法,这是您的 Meteor 应用程序执行单个任务并死掉。那就不用担心清理了。
如果使用 Velocity,您可以启动 "self-destructing mirror"。你可以启动它like this and kill the mirror like this.
如果您不使用 Velocity,您仍然可以使用上述相同的方法,方法是从您的主应用中分叉一个 child_process 来启动 .meteor/.../build/main.js
您可以通过向 child_process 传递一个环境变量来告诉您的应用它处于工作模式。
旁注:自从我们(Velocity 团队)为镜像做了这个,我就一直在考虑编写一个 Meteor worker 包来完成上述工作。
我正在尝试实现简单的功能以允许 Meteor 应用程序检查某个 MongoDB 字符串是否可以成功用于连接。为此,我有一个事件触发一个服务器方法,该方法建立与 MongoDB 和 returns 集合中文档数量的连接。 我使用的(简化)方法采用 mongo 连接字符串和集合名称以及 returns 集合中的文档数。
var mongoUrl = "mongodb://user:password@192.168.0.98: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
所有后续调用都失败了,因为 Meteor 已经为 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
如何在 Meteor 中注销集合以执行这些临时数据库连接?
虽然我没有得到您直接问题的答案,但我有一个想法可能会对您的探索有所帮助!
我会考虑使用 "worker" 方法,这是您的 Meteor 应用程序执行单个任务并死掉。那就不用担心清理了。
如果使用 Velocity,您可以启动 "self-destructing mirror"。你可以启动它like this and kill the mirror like this.
如果您不使用 Velocity,您仍然可以使用上述相同的方法,方法是从您的主应用中分叉一个 child_process 来启动
.meteor/.../build/main.js
您可以通过向 child_process 传递一个环境变量来告诉您的应用它处于工作模式。
旁注:自从我们(Velocity 团队)为镜像做了这个,我就一直在考虑编写一个 Meteor worker 包来完成上述工作。