Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 流星数据库连接_Mongodb_Meteor - Fatal编程技术网

Mongodb 流星数据库连接

Mongodb 流星数据库连接,mongodb,meteor,Mongodb,Meteor,我正在尝试连接到我的Mongo数据库,该数据库作为我的Meteor应用程序位于机器上。我的应用程序中有两个文件: a、 js: b、 js: 但是我在template helper:ReferenceError:Box未定义错误-有什么想法吗?Meteor有两个不同的环境:在Node.JS上运行的服务器环境和在浏览器中运行的客户端环境 在您的代码中,您仅在服务器环境中声明Boxes Mongo集合,您需要将此声明从Meteor.isServer条件中去掉,顺便说一句,不要使用这些,请在serve

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

a、 js:

b、 js:


但是我在template helper:ReferenceError:Box未定义错误-有什么想法吗?

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

在您的代码中,您仅在服务器环境中声明Boxes Mongo集合,您需要将此声明从Meteor.isServer条件中去掉,顺便说一句,不要使用这些,请在server/、client/和lib/目录中分隔代码


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

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

a、 js:

b、 js


你如何用Meteor连接MongoDB

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

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

 Boxes = new Mongo.Collection("boxes"); // use default MongoDB connection
场景B:使用不同的数据库作为默认值

使用MONGO_URL环境变量,可以在启动Meteor服务器时将连接字符串设置为MongoDB。您可以指定连接的确切位置和方式,而不是本地端口3001数据库或未经验证的连接。按如下方式启动Meteor服务器:

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

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

现在我们需要使用mongonternals.RemoteCollectionDriver。如果您希望使用另一个不是在启动Meteor服务器时定义的默认DB的数据库,则应使用您的方法

var database = new MongoInternals.RemoteCollectionDriver('mongodb://user:password@localhost:27017/meteor');
var numberOfDocs = database.open('boxes').find().count();
奖励:为什么不在Mongo.Collection中使用MongoInternals


因为您不应该将任何Mongo连接传递到新的Mongo.Collection命令,而应该只传递到另一个Meteor实例的连接。这意味着,如果您使用DDP.connect连接到其他服务器,您可以使用您的代码-但您不应该将MongoInternals与Mongo.Collection混合使用-它们不能很好地协同工作。

我将声明从Meteor.isServer条件中移到了上面,现在出现了以下错误:MongoInternals未定义-有什么想法吗?p、 我尝试使用此方法,因为在其他地方的堆栈溢出上建议使用此方法替代MONGO_URL方法。然后尝试使用2个声明,一个在服务器中使用MongoInternals,另一个在客户端中不使用。使用2个声明与在任何isClient/isServer块之外使用一个声明的文档相矛盾,因此生成的变量可以在整个应用程序中全局访问。请再次阅读我的回答:Meteor中有2个环境,因此,一个变量永远不会在整个应用程序中真正可用,一个声明总是会产生对应于两个不同环境的两个不同版本的变量。在您的特定情况下,您无法在两种环境中无缝声明集合,因为客户端上无法使用MongoInternals,因此您必须依赖两个单独的声明。我再次阅读了您的回答,没有看到您说客户端无法使用MongoInternals的任何内容。现在您已经提到了这一点,您能为我自己和其他人指出关于这一点的文档方向吗?那么,声明远程集合的最简单方法是什么?var Boxes=database.open‘Boxes’这句话行得通吗?这并不是那么简单,因为在一个简单的数据库集合之外还有很多神奇的东西,比如反应性、跟踪oplog等。如果没有这些特性,场景C可以让您快速方便地访问远程DB coll,它只是没有反应。请注意:集合可能看起来是空的,您需要进行插入才能查看数据。您尚未在客户端上定义集合。您必须在服务器和客户端上定义它。我认为在客户端上定义它时,不必传递任何第二个参数,因为您仍然使用默认的服务器连接。看来你已经明白了-
if (Meteor.isClient) {
    Boxes = new Mongo.Collection("boxes");
    Meteor.subscribe('boxes');
    Template.homeCanvasTpl.helpers({
        boxes: function () {
            return Boxes.find({});
        }
    });
}
 Boxes = new Mongo.Collection("boxes"); // use default MongoDB connection
$ MONGO_URL=mongodb://user:password@localhost:27017/meteor meteor
var database = new MongoInternals.RemoteCollectionDriver('mongodb://user:password@localhost:27017/meteor');
var numberOfDocs = database.open('boxes').find().count();