我确定正确创建了我的收藏集,发布了数据,订阅了正确的出版物,并检查了数据是否确实出现在Mongo Shell中。我甚至用console.log()来发布正在发布的数据,以确保发布正常进行。但是,以下代码行无法返回任何内容:const maybeMeet = Meets.find({meetId: maybeId}).fetch();
可以在下面和链接的回购中/client/imports/routes/routes.js
的第39行中找到。
有一次,我什至试图创建一个新的Meteor方法'meets.query'
,它将仅发布我需要的所有数据,(不安全地)避免了对发布和订阅的需求(现在在/client/imports/api/meets.js
的第59行中将其注释掉) 。那也没有用。通常,似乎客户端无法从服务器接收任何数据,但是从客户端到服务器的访问似乎可行(我可以将东西插入我的Meets集合中)。
这是问题的根源(routes.js
的一部分):
export const routes = (
<div id='app'>
<Header />
<Router history={browserHistory}>
<Switch>
<Route exact path="/" render={() => {
return <Landing />
}} />
<Route path="/before" render={() => {
return <Before />
}} />
<Route path="/meet" render={() => {
Meteor.subscribe('allMeets');
const maybeId = queryString.parse(location.search).m;
console.log(typeof maybeId);
console.log(maybeId);
const maybeMeet = Meets.find({meetId: maybeId}).fetch(); //***RETURNS NOTHING!***
return maybeMeet.length ? <Created meet={maybeMeet[0]} /> : <NotFound />;
}} />
<Route path="*" render={() => {
return <NotFound />
}} />
</Switch>
</Router>
</div>
);
这是我发布数据的地方(“ meets.js”的一部分):
if (Meteor.isServer) {
Meteor.publish('allMeets', function() {
return Meets.find();
});
}
如果需要查看更多信息,请参见整个代码的仓库:https://github.com/kpeluso/meetr
我为混乱的代码感到抱歉-这是一个新项目。
最佳答案
这里的问题是订阅操作是异步的,因为它必须从服务器中获取数据。
解决方案是将路由器渲染的组件包装在WithTracker
中,以便在数据可用时重新运行,并开始渲染到DOM。
有关如何执行此操作的更多信息,请参阅文档:
https://guide.meteor.com/react.html#using-withTracker