Meteor 无法连接到 MongoDB
Posted
技术标签:
【中文标题】Meteor 无法连接到 MongoDB【英文标题】:Meteor does not connect to MongoDB 【发布时间】:2013-07-27 00:09:43 【问题描述】:我正在尝试将 Meteor 连接到现有的 MongoDB。我无法复制数据库或更改其名称,因为它已被其他应用程序使用。
我知道I have to set a MONGO_URL
environment var 可以与它联系。但是,在我设置之后,Meteor 并没有连接到指定的 MongoDB 数据库。我尝试做一个.find()
,但它没有返回任何文档。来自 Web 控制台的 .insert()
会显示页面中的信息,但不会插入到数据库中。以下是代码:
$ echo $MONGO_URL
mongodb://localhost:27017/autana_dev
./lib/models.js
Posts = new Meteor.Collection('posts');
./server/app.js
Meteor.publish('posts', function()
return Posts.find();
);
./client/app.js
Meteor.subscribe('posts');
Template.main.posts = function()
return Posts.find();
;
有什么想法吗?任何人?我的 Meteor 版本是 0.6.4.1,MongoDB 版本是 2.4.1。
更新:7 月 28 日
在使用meteor run
运行meteor 之后,我在项目目录中打开了一个新的控制台窗口来运行meteor mongo 控制台。但是,在运行meteor mongo
之后,我收到了以下信息:
mongo: Meteor isn't running.
This command only works while Meteor is running your application
locally. Start your application first.
【问题讨论】:
您是在捆绑的应用程序中尝试这个还是使用meteor [run]
?
@Akshat 现在只运行meteor
。
@betacar 在运行流星时打开一个单独的终端并在项目目录中使用命令meteor mongo
。它是否连接到数据库,你可以在那里运行命令吗?
您的 MONGO_URL 是什么样的?是不是类似于mongodb://name:pass@host1:port1,host2:port2
?
meteor mongo 不适用于 METEOR_URL - 请参阅此答案:***.com/a/16495135/194957
【参考方案1】:
如您所知,因为您发布了issue,这是流星中的一个错误。
我的解决方法是使用标准 mongo 客户端连接到我的 mongodb。您可以通过查看文件 yourapp/.meteor/db/METEOR-PORT
找到您的数据库正在运行的端口,然后运行 mongo localhost:[put that port number here]
。
【讨论】:
【参考方案2】:您确定问题是 Meteor 没有连接到数据库吗?这里有几个必须一起工作的部分。我没有发现任何明显错误,但我会简化代码以验证问题是否在您认为的位置。
例如,尝试将 console.log(Posts.find()) 添加到服务器上的 Meteor.startup 中。
【讨论】:
console.log(Posts.find());
返回一个没有集合也没有文档的对象:Object collection=..., cursor_pos=0, reactive=true
; Object docs=..., _observeQueue=..., next_qid=2, more...
我突然遇到了和你一样的问题@betacar 但我的console.log 由于某种原因默认为LocalCollection
- 尽管我明确使用了一个名称:LocalCollection.Cursor collection: LocalCollection,
尝试 console.log(Posts.find().count()) 代替。 Find 不会立即访问数据库或返回文档。【参考方案3】:
我假设您在 Linux 或 Mac 上运行 Meteor。如果不是这种情况,代码可能不起作用。
最明显的原因是 mongo 数据库不包含任何posts
文档。输出是什么:
$ mongo
> use autana_dev
> db.posts.find().count()
如果输出不是null
或0
,您可能需要使用用户名和密码进行连接。
export MONGO_URL="mongodb://user:password@localhost:27017/autana_dev
如果这没有帮助,我会尝试添加一些日志来查看帖子是否未发送或未收到:
Meteor.publish('posts', function()
console.log("returning " + Posts.find().count() + " posts");
return Posts.find();
);
如果客户端上的数字大于0
var postsHandle = Meteor.subscribe('posts');
Template.main.posts = function()
if( postsHanlde.ready() )
console.log("I have " + Posts.find().count() + " posts on the client");
return Posts.find();
;
if( postsHanlde.ready() )
条件确保您不会在帖子到达之前尝试显示它们。
如果您的 mongodb 中有文档,但在 Meteor 中没有选择任何内容,则可能是您的 mongodb 工作不正常。
用在线解决方案替换 mongodb 很容易检查。在mongolab 上创建一个免费帐户,并将您的 MONGO_URL 更改为 mongolab 控制台提供的那个。在那里插入一些帖子并再次测试。
如果您仍然没有得到任何文件,那么...
这就是我从您的输入中所能想到的全部内容。希望对您有所帮助。
【讨论】:
posts
集合包含近 200 万个文档。显然不是收藏。我的本地 MongoDB 不受用户/通行证身份验证的保护,因为它旨在用于开发目的。
某处一定有错误。您是否尝试了日志记录部分以了解是否正在发送数据?【参考方案4】:
首先,在一个 shell 的窗口中运行 mongo
然后在拳头还在运行的同时在另一个 shell 的窗口中运行“meteor mongo”! 在我的 Mac 上,在“排行榜示例”中,我是这样做的:
-
“流星跑排行榜”
"cd .meteor/leaderboard;meteor mongo"
【讨论】:
以上是关于Meteor 无法连接到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章
在 Ubuntu 20.04 上无法连接到 mongodb,连接被拒绝
无法使用 MEAN 堆栈连接到 Mongodb.atlas 集群
Dockerizing NestJS APP 和 MongoDB “首次连接时无法连接到服务器 [localhost:27017]”