我正在尝试连接到位于机器上的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没有被定义"错误 - 任何想法?
答案 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.connect
与MongoInternals
混合使用 - 他们不会一起工作。
答案 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。)