我需要使用外部MongoDB开发Meteor应用程序,但我不确定如何使用Meteor连接和获取外部Mongo数据。
以下是我的尝试。
我可以连接到终端下的外部MongoDB(使用数据库sm_app
):
$ mongo <USER>:<PASSWORD>@<SERVER>:<PORT>/sm_app
并获取唯一的一个数据:
> db.servertop10.findOne()
它显示:
{
"_id": ObjectId("......")
"list": [
...
]
}
现在我尝试在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
以前,我只尝试在前端获取数据。现在我尝试在服务器端和客户端都记录结果。
// 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: ..., ...}
我不知道为什么我无法在客户端获取数据。
答案 0 :(得分:0)
检查
MONGO_URL="mongodb://<USER>:<PASSWORD>@<SERVER>:<PORT>/sm_app" meteor
此外,如果您不使用包自动发布和不安全,那么您将不得不使用发布和订阅方法。
答案 1 :(得分:0)
感谢Khang和Mikkel,我终于解决了这个问题。
如果您遇到同样的问题,请检查:
export
用于带有网址(MONGO_URL
)的外部Mongo。createContainer
中的react-meteor-data
来触发数据库启动或其数据更改时的回调。对export
使用MONGO_URL
后,我发现我仍然无法在客户端获取数据,但它可以在服务器端运行。
这是因为我在Meteor中使用了 React ,我忘了使用createContainer
派生的react-meteor-data
来将迷你Mongo集合中的数据更改连接到React组件。在React的render()
或Meteor.startup()
中记录抓取结果将打印undefined
,直到数据库更改触发传递给createContainer
的回调为止。