问题:为什么 Collection.find() 在我的 Meteor 客户端上不起作用?

我确信正确地创建了我的集合,发布了数据,订阅了正确的发布,并检查了数据是否真的出现在 Mongo Shell 中。我什至 console.log()'d 正在发布的数据以确保发布工作正常。但是,以下代码行无法返回任何内容:

const maybeMeet = Meets.find({meetId: maybeId}).fetch();

这可以在链接仓库中/client/imports/routes/routes.js的第 39 行下方和第 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();
  });
}

如果您需要查看更多内容,请查看完整代码的 repo:https://github.com/kpeluso/meetr

我为凌乱的代码道歉 - 这是一个新项目。

解答

这里的问题是订阅操作是异步的,因为它必须从服务器获取数据。

解决方案是将路由器渲染的组件包装在一个WithTracker中,这样当数据可用时它会重新运行并开始渲染到 DOM

有关如何执行此操作的更多信息,请参阅文档:https://guide.meteor.com/react.html#using-withTracker

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐