使用外部MongoDB并使用Meteor.js获取数据

时间:2016-11-22 02:12:16

标签: mongodb meteor

我需要使用外部MongoDB开发Meteor应用程序,但我不确定如何使用Meteor连接和获取外部Mongo数据。

以下是我的尝试。

在shell中获取外部MongoDB数据(成功)

我可以连接到终端下的外部MongoDB(使用数据库sm_app):

$ mongo <USER>:<PASSWORD>@<SERVER>:<PORT>/sm_app

并获取唯一的一个数据:

> db.servertop10.findOne()

它显示:

{
  "_id": ObjectId("......")
  "list": [
    ...
  ] 
}

在Meteor中获取外部MongoDB数据(失败)

现在我尝试在Mac上使用外部MongoDB运行Meteor:

MONGO_URL=mongodb://<USER>:<PASSWORD>@<SERVER>:<PORT>/sm_app meteor run

然后尝试在Meteor.js中获取数据:

import { Mongo } from 'meteor/mongo';

const ServerMonitor = new Mongo.Collection('servertop10');
console.log('findOne:', ServerMonitor.findOne());

但它显示:

findOne: undefined

问题

  1. 如何在Meteor.js下获取数据?
  2. Meteor.js中的其他数据库是否可以使用相同的外部MongoDB?怎么做?
  3. 修改

    以前,我只尝试在前端获取数据。现在我尝试在服务器端和客户端都记录结果。

    // Import this file on the main.js files of both server and client
    import { Mongo } from 'meteor/mongo';
    
    const ServerMonitor = new Mongo.Collection('servertop10');
    Meteor.startup(() => {
      console.log('MONGO_URL:', process.env.MONGO_URL);
      console.log('findOne:', ServerMonitor.findOne());
    }
    

    服务器端显示:

    > MONGO_URL: mongodb://<USER>:<PASSWORD>@<SERVER>:<PORT>/sm_app
    > findOne: {
      "_id": ObjectId("......")
      "list": [
        ...
      ] 
    }
    

    但是客户端显示:

    > MONGO_URL: undefined
    > findOne: undefined
    

    我仍然无法获取React组件的render()中的数据:

    render() {
      // still print `undefined`
      console.log('findOne:', ServerMonitor.findOne());
      return (<h1>Hello</h1>);
    }
    

    但是我可以在浏览器的控制台上获取数据(使用autopublish):

    > ServerMonitor.findOne()
      Object {_id: ..., ...}
    

    我不知道为什么我无法在客户端获取数据。

2 个答案:

答案 0 :(得分:0)

检查

MONGO_URL="mongodb://<USER>:<PASSWORD>@<SERVER>:<PORT>/sm_app" meteor

此外,如果您不使用包自动发布和不安全,那么您将不得不使用发布和订阅方法。

答案 1 :(得分:0)

感谢Khang和Mikkel,我终于解决了这个问题。

如果您遇到同样的问题,请检查:

  • export用于带有网址(MONGO_URL)的外部Mongo。
  • 如果您使用React with Meteor,请确保使用createContainer中的react-meteor-data来触发数据库启动或其数据更改时的回调。

export使用MONGO_URL后,我发现我仍然无法在客户端获取数据,但它可以在服务器端运行。

这是因为我在Meteor中使用了 React ,我忘了使用createContainer派生的react-meteor-data来将迷你Mongo集合中的数据更改连接到React组件。在React的render()Meteor.startup()中记录抓取结果将打印undefined,直到数据库更改触发传递给createContainer的回调为止。