我正在尝试连接我的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();
});
}
Run Code Online (Sandbox Code Playgroud)
b.js:
if (Meteor.isClient) {
Meteor.subscribe('boxes');
Template.homeCanvasTpl.helpers({
boxes: function () {
return Boxes.find({});
}
});
}
Run Code Online (Sandbox Code Playgroud)
但我不断得到一个"模板助手中的异常:ReferenceError:Boxes未定义"错误 - 任何想法?
Ste*_*han 17
如何使用Meteor连接到MongoDB?
场景A:默认使用内置数据库
这比你做的简单得多.当你运行时meteor,实际上启动了一个带有Meteor服务器的数据库,其中Meteor监听端口3000和端口3001上的数据库.Meteor应用程序已经在端口3001连接到该数据库并使用名为db的数据库meteor.没有必要回头MongoInternals.RemoteCollectionDriver.只需删除该代码并将内容更改为:
Boxes = new Mongo.Collection("boxes"); // use default MongoDB connection
Run Code Online (Sandbox Code Playgroud)
方案B:默认使用其他数据库
使用MONGO_URL环境变量,您可以在启动Meteor服务器时将连接字符串设置为MongoDB.您可以准确指定连接的位置和方式,而不是本地端口3001数据库或未经身份验证的连接.像这样启动Meteor服务器:
$ MONGO_URL=mongodb://user:password@localhost:27017/meteor meteor
Run Code Online (Sandbox Code Playgroud)
user:password@如果不需要身份验证,您也可以省略命令的一部分.
场景C:从同一个Meteor应用程序连接到第二个(第3个等)数据库
现在我们需要使用MongoInternals.RemoteCollectionDriver.如果您希望使用另一个不是启动Meteor服务器时定义的默认数据库的数据库,您应该使用您的方法.
var database = new MongoInternals.RemoteCollectionDriver('mongodb://user:password@localhost:27017/meteor');
var numberOfDocs = database.open('boxes').find().count();
Run Code Online (Sandbox Code Playgroud)
奖励:你为什么要使用不MongoInternals带Mongo.Collection?
正如文档所示,您不应将任何Mongo连接传递给该new Mongo.Collection()命令,而只应传递给另一个Meteor实例的连接.这意味着,如果您使用DDP.connect连接到不同的服务器,您可以使用您的代码 - 但您不应该混合MongoInternals使用Mongo.Collection- 它们不能很好地协同工作.
Meteor 有 2 个不同的环境:运行在 Node.JS 上的服务器环境和运行在浏览器中的客户端环境。
Boxes在您的代码中,您仅在服务器环境中声明Mongo 集合,您需要将此声明从Meteor.isServer条件中删除(顺便说一句,不要使用这些,将您的代码分隔在server/,client/和lib/目录中)。
另外,不确定您是否需要以这种方式连接到 MongoDB,也许您应该查看MONGO_URL环境变量,它可能已经满足您的需要了?(提供到远程(或本地)Mongo 服务器的 mongo 连接 URL)。
| 归档时间: |
|
| 查看次数: |
12565 次 |
| 最近记录: |