Javascript 为什么Collection.find()在我的Meteor客户端上不起作用?
我确保正确创建我的集合,发布数据,订阅正确的发布,并检查数据是否确实出现在Mongo Shell中。我甚至对正在发布的数据进行了console.log()检查,以确保发布正常工作。但是,以下代码行无法返回任何内容:Javascript 为什么Collection.find()在我的Meteor客户端上不起作用?,javascript,mongodb,reactjs,meteor,Javascript,Mongodb,Reactjs,Meteor,我确保正确创建我的集合,发布数据,订阅正确的发布,并检查数据是否确实出现在Mongo Shell中。我甚至对正在发布的数据进行了console.log()检查,以确保发布正常工作。但是,以下代码行无法返回任何内容: const maybemete=Meets.find({meetId:maybeId}).fetch() 这可以在链接的回购协议的/client/imports/routes/routes.js的第39行中找到 有一次,我甚至尝试创建一个新的Meteor方法'meets.query'
const maybemete=Meets.find({meetId:maybeId}).fetch()代码>
这可以在链接的回购协议的/client/imports/routes/routes.js
的第39行中找到
有一次,我甚至尝试创建一个新的Meteor方法'meets.query'
,它只发布我需要的所有数据,(不安全地)避免了发布和订阅的需要(现在在/client/imports/api/meets.js
的第59行注释掉了)。这也不起作用。一般来说,客户端似乎无法从服务器接收任何数据,但从客户端到服务器似乎是可行的(我可以将内容插入我的集合)
以下是问题的根源(部分routes.js
):
如果您需要了解更多信息,请参阅回购协议以了解全部代码:
对于混乱的代码,我向您道歉-这是一个新项目。这里的问题是订阅操作是异步的,因为它必须从服务器获取数据
解决方案是将路由器渲染的组件包装在带有跟踪器的中,以便在数据可用时重新运行,并开始渲染到DOM
有关如何执行此操作的更多信息,请参见文档:
在我创建的组件中,我有一个Tracker.autorun()
,其中有一个错误,这导致其他所有东西都崩溃了。调用Meteor.subscribe(allMeets)如前所述,我的路由器中的code>也是异步的,并且没有这样处理
我发现withTracker的很麻烦,但我从它的文档中获得了很多灵感。因此,myCreated
组件中编辑的代码现在包括以下内容:
componentDidMount() {
this.meetTracker = Tracker.autorun(() => {
const subHandle = Meteor.subscribe('allMeets');
const loading = !subHandle.ready();
const maybeMeet = Meets.find({meetId: this.props.meetId}).fetch();
if (!maybeMeet.length && loading) {
this.setState({active: <Loading />});
} else if (!loading) {
if (maybeMeet.length) {
this.setState({active: <During meet={maybeMeet[0]} />});
} else {
createHistory().push('/PageNotFound');
window.location.reload();
}
}
});
}
<Route path="/meet" render={() => {
const maybeId = queryString.parse(location.search).m;
return <Created meetId={maybeId} />
}} />
使用Tracker,查看meteor文档
例如,在这段代码中,对于应用程序组件,withTracker与订阅保持同步,而things列表获取集合
export default withTracker(() => {
Meteor.subscribe('allThings')
return {
things: Things.find({}).fetch()
}
})(App);
检查我的meteor react样板
我使用软件包meteor/react meteor data
。HOFwithTracker
是正确的解决方案。我不需要访问您的代码库。请阅读。刚刚编辑,感谢社区指南的链接。
<Route path="/meet" render={() => {
const maybeId = queryString.parse(location.search).m;
return <Created meetId={maybeId} />
}} />
export default withTracker(() => {
Meteor.subscribe('allThings')
return {
things: Things.find({}).fetch()
}
})(App);