流星数据库连接

时间:2015-02-28 22:50:01

标签: mongodb meteor

我正在尝试连接到位于机器上的Mongo数据库作为我的Meteor应用程序。以下是我的应用中的两个文件:

a.js:

if (Meteor.isServer) {

    var database = new MongoInternals.RemoteCollectionDriver("mongodb://127.0.0.1:3001/meteor");
    Boxes = new Mongo.Collection("boxes", { _driver: database });
    Meteor.publish('boxes', function() {
        return Boxes.find(); 
    }); 
}

b.js:

if (Meteor.isClient) {
    Meteor.subscribe('boxes');
    Template.homeCanvasTpl.helpers({
        boxes: function () {
            return Boxes.find({});
        }
    });
}

但是我一直在模板助手中得到一个"异常:ReferenceError:Boxs没有被定义"错误 - 任何想法?

3 个答案:

答案 0 :(得分:17)

如何使用Meteor连接到MongoDB?

场景A:使用内置数据库作为默认值

这比你做的简单得多。运行meteor时,实际上是使用Meteor服务器启动数据库,其中Meteor在端口3000上侦听,数据库在端口3001上侦听.Meteor应用程序已在端口3001连接到此数据库并使用名为{{的数据库1}}。没有必要回到meteor。只需删除该代码并将内容更改为:

MongoInternals.RemoteCollectionDriver

场景B:默认使用其他数据库

使用 Boxes = new Mongo.Collection("boxes"); // use default MongoDB connection 环境变量,您可以在启动Meteor服务器时将连接字符串设置为MongoDB。您可以准确指定连接的位置和方式,而不是本地端口3001数据库或未经身份验证的连接。像这样启动Meteor服务器:

MONGO_URL

如果不需要身份验证,您也可以省略命令的$ MONGO_URL=mongodb://user:password@localhost:27017/meteor meteor 部分。

场景C:从同一个Meteor应用程序连接到第二个(第3个等)数据库

现在我们需要使用user:password@。如果您希望使用另一个不是启动Meteor服务器时定义的默认数据库的数据库,您应该使用您的方法。

MongoInternals.RemoteCollectionDriver

加分:为什么不将var database = new MongoInternals.RemoteCollectionDriver('mongodb://user:password@localhost:27017/meteor'); var numberOfDocs = database.open('boxes').find().count(); MongoInternals一起使用?

作为the docs indicate,您不应将任何Mongo连接传递给Mongo.Collection命令,而只应传递给另一个Meteor实例的连接。这意味着,如果您使用new Mongo.Collection()连接到其他服务器,则可以使用您的代码 - 但您不应该将DDP.connectMongoInternals混合使用 - 他们不会一起工作。

答案 1 :(得分:1)

根据saimeunt在上述评论中的反馈,他/她指出MongoInternals不适用于Meteor应用程序的客户端部分。因此,解决方案是在行中添加" Boxes = new Mongo.Collection(" box");"客户逻辑 - 这是最终的工作解决方案:

a.js:

if (Meteor.isServer) {

    var database = new MongoInternals.RemoteCollectionDriver("mongodb://127.0.0.1:3001/meteor");
    Boxes = new Mongo.Collection("boxes", { _driver: database });
    Meteor.publish('boxes', function() {
        return Boxes.find(); 
    }); 
}

b.js

if (Meteor.isClient) {
    Boxes = new Mongo.Collection("boxes");
    Meteor.subscribe('boxes');
    Template.homeCanvasTpl.helpers({
        boxes: function () {
            return Boxes.find({});
        }
    });
}

答案 2 :(得分:0)

Meteor有两种不同的环境:在Node.JS上运行的服务器环境和在浏览器中运行的客户端环境。

在您的代码中,您只在服务器环境中声明Boxes Mongo集合,您需要从Meteor.isServer条件中取出此声明(并且BTW不要使用这些声明,将您的server/client/lib/目录中的代码。

另外,不确定是否需要以这种方式连接到MongoDB,也许您应该查看MONGO_URL环境变量,它可能已经满足您的需求? (提供到远程(或本地)Mongo服务器的mongo连接URL。)