Meteor无法连接MongoDB。

6
我正在尝试将Meteor连接到现有的MongoDB。我无法复制数据库或更改其名称,因为它被其他应用程序使用。
我知道必须设置MONGO_URL环境变量才能连接它。然而,在我设置后,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();
});

./客户端/应用程序.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 console。然而,在运行meteor mongo之后,我收到了以下信息:
mongo: Meteor isn't running.

This command only works while Meteor is running your application
locally. Start your application first.

你是在捆绑应用程序中尝试还是使用 meteor [run] 命令? - Tarang
@Akshat 现在只是运行 meteor - betacar
@MrD 它返回 mongo: Meteor 没有运行。非常奇怪的错误。 - betacar
@imslavko ~|⇒ echo $MONGO_URL mongodb://localhost:27017/autana_dev - betacar
3
Meteor的Mongo与METEOR_URL不兼容 - 请参考此答案:http://stackoverflow.com/a/16495135/194957 - jrullmann
显示剩余3条评论
4个回答

3

如您所知,因为您发布了该问题,这是meteor中的一个bug。

我的解决方法是使用标准的mongo客户端连接到我的mongodb。您可以通过查看文件yourapp/.meteor/db/METEOR-PORT找到您的数据库运行的端口号,然后只需运行mongo localhost:[将端口号放在此处]即可。


0

我假设你在 Linux 或 Mac 上运行 Meteor。如果不是这种情况,代码可能无法正常工作。

最明显的原因是 mongo 数据库中没有包含任何 posts 文档。以下是输出结果:

$ mongo
> use autana_dev
> db.posts.find({}).count()

如果输出不是null0,您可能需要使用用户名和密码进行连接。

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(postsHandle.ready())的条件确保在文章到达之前不会尝试显示它们。

如果您在MongoDB中有文档但Meteor没有选择任何内容,则可能是因为您的MongoDB没有正常工作。

通过将MongoDB替换为在线解决方案来检查这一点非常容易。在mongolab上创建一个免费帐户,并将MONGO_URL更改为mongolab控制台提供的帐户。插入一些文章并再次测试。

如果仍然无法获取任何文档,则......

这就是我从您的输入中想到的所有内容。希望能对您有所帮助。


“posts” 集合包含近 200 万个文档。显然这不是集合的问题。我的本地 MongoDB 没有使用用户/密码身份验证进行保护,因为它旨在用于开发目的。 - betacar
一定有错误出现了。你尝试过使用日志记录部分来查找数据是否被发送了吗? - Micha Roon

0

你确定问题是Meteor无法连接到数据库吗?这里有几个部分需要一起工作。我没有看到明显的错误,但我会简化代码以验证问题是否出现在你认为的地方。

例如,在服务器上的Meteor.startup中尝试添加console.log(Posts.find())。


console.log(Posts.find()); 返回一个没有集合或文档的对象:Object { collection={...}, cursor_pos=0, reactive=true}Object { docs={...}, _observeQueue={...}, next_qid=2, more...} - betacar
我也突然遇到了和@betacar一样的问题,但是我的console.log默认使用了LocalCollection,尽管我明确地使用了名字:LocalCollection.Cursor {collection: LocalCollection, - Jason J. Nathan
尝试使用console.log(Posts.find().count())。Find不会立即访问数据库或返回文档。 - jrullmann

0

首先,在一个终端窗口中运行Mongo。

然后,在另一个终端窗口中运行“meteor mongo”,同时第一个终端仍在运行!在我的Mac上,“leaderboard example”中,我是这样做的:

  1. “meteor run leaderboard”
  2. “cd .meteor/leaderboard; meteor mongo”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接