在 Meteor 运行时,如何从另一个客户端访问 Meteor 的 MongoDB?

Posted

技术标签:

【中文标题】在 Meteor 运行时,如何从另一个客户端访问 Meteor 的 MongoDB?【英文标题】:How do I access Meteor's MongoDB from another client, while Meteor is running? 【发布时间】:2012-05-04 20:18:11 【问题描述】:

我想从 Python 客户端访问 Meteor 的 MongoDB,在 Meteor 运行时

我无法启动 mongod,因为 Meteor 的数据库已锁定。

如何从其他客户端访问数据库?

【问题讨论】:

【参考方案1】:

您也可以使用以下方法从服务器端代码中找到它:

process.env.MONGO_URL

即使你在运行时没有设置这个环境变量,它也会被设置为默认值。这似乎是在内部找到它的方式(packages/mongo/remote_collection_driver.js)

meteor mongo -U给出的那个似乎重构了默认的域/ip和db-name,但是使用了文件中存储的端口。

您可以将它放在服务器文件夹中的任何位置,然后从命令行读取它。

console.log('db url: ' + process.env.MONGO_URL);

我设置了一个网页来显示它,以仔细检查我们正在使用测试数据库的 selenium 测试,而不是覆盖实时数据。

【讨论】:

【参考方案2】:

关于更新延迟 10 秒:跟踪 MongoDB oplog!有关如何在此处执行此操作的更多信息:

http://meteorhacks.com/lets-scale-meteor.html

确保您安装并使用智能集合(使用 Meteor.SmartCollection 而不是 Meteor.Collection 实例化您的集合),您会发现更新基本上是即时的。

【讨论】:

请尝试阅读此***.com/help/deleted-answers,以进一步了解如何回答。即:“没有从根本上回答问题的答案”:仅是指向外部网站的链接【参考方案3】:

这里还有一个用于获取 Mongo URI 和 Mongo 数据库的 shell 脚本:

#!/bin/bash -eux

read -s -p "Enter Password: " password

cmd=$(meteor mongo --url myapp.meteor.com << ENDPASS
$password
ENDPASS)
mongo_uri=$(echo $cmd | cut -f2 -d" ")
mongo_db=$(echo $mongo_uri | cut -d/ -f 4)

#my_client_command_with MONGODB_URI=$mongo_uri MONGO_DB=$mongo_db

````

【讨论】:

【参考方案4】:

当你运行meteor命令时,Meteor会在3002端口为你启动mongod,并将mongo数据文件存储在.meteor/local/db

ps aux | grep 'mongod' 的输出显示了流星使用的 mongod 命令:

/usr/local/meteor/mongodb/bin/mongod --bind_ip 127.0.0.1 --smallfiles --port 3002 --dbpath /path/to/your/project/.meteor/local/db

因此,只需相应地连接您的 mongo 客户端即可。在python中:

>>> import pymongo
>>> con = pymongo.Connection(host='127.0.0.1', port=3002)
>>> con.database_names()
[u'meteor', u'local']

更新:不幸的是,以这种方式直接在 mongo 中进行更改不会反映在应用程序中,但更改将反映在整个页面(重新)加载中。

【讨论】:

是的,我相信我们可以重新使用轮询,但这会使流星的整个目的无效——通过观察者模式更新的反应模板。 实际上,似乎不需要重新加载整页。在这个文件中 - github.com/meteor/meteor/blob/master/packages/mongo-livedata/… - 无论 Mongo 的“脏”状态如何,你都会每 10 秒看到一个刷新计时器。直接更新mongo,等待10s,浏览器就会出现变化。 我刚刚对此进行了测试,它确实有效,您只需等待 10 秒即可更新。我希望有一种方法可以改变设定间隔的速度,而不必深入研究 mongo-livedata。 这个答案已经过时了。现在写入 Mongo 将立即对所有连接的服务器进行页面更新。 对我来说它是端口 3001,请确保运行 ps aux | grep 'mongod' 命令以查看它在您的计算机上使用的端口。【参考方案5】:

meteor 命令提供了一种简洁的方式。获取正在运行的 mongod 的 URL:

meteor mongo -U

你可以从 python 中解析出来。

【讨论】:

对托管在 .meteor.com 上的受密码保护的实例使用 meteor mongo -U &lt;myproj&gt; 提供的 mongo URL 失败,身份验证错误。我做错了吗,是设计使然,还是错误? 该命令适用于受密码保护的站点——它会提示输入密码。如果您从 Meteor 收到身份验证错误,它会认为密码不匹配。 返回的网址只有一分钟有效。如果 mongo 本身失败,请尝试获取新的 URL。 这正是我所需要的,谢谢。我能够让我的 python 代码进行连接。现在我在尝试与数据库通信时看到一些错误,但我稍后会检查一下。 这应该是最佳答案。当端口 3002 被其他东西使用时,Meteor 将为 Mongo 使用另一个端口。使用此命令,您可以找出当前使用的是哪一个。【参考方案6】:

使用Meteor deployment instructions

命令将如下所示:

   PORT=3000 MONGO_URL=mongodb://localhost:27017/myapp node bundle/main.js

【讨论】:

这看起来像是一个完全不同的问题的答案。

以上是关于在 Meteor 运行时,如何从另一个客户端访问 Meteor 的 MongoDB?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Meteor 中访问客户端 IP 地址? [复制]

Meteor / MongoDB - 如何证明数组中的任何项目是不是等于特定值,而不是在“真”的情况下从另一个数组中提取项目?

如何在 Meteor 中使用客户端重新连接事件

如何在 vscode 中为 IntelliSense 定义流星开发的运行时

在模板上下文中从另一个助手调用一个助手 (Meteor 0.9.4)

在 Jasmine 中访问 Meteor 模板辅助函数以进行集成测试