簡體   English   中英

為什么Collection.find()不能在我的Meteor客戶端上運行?

[英]Why is Collection.find() not working on my Meteor client?

我確信正確創建我的集合,發布數據,訂閱正確的出版物,並檢查數據是否實際出現在Mongo Shell中。 我甚至在console.log()中發布了正在發布的數據,以確保發布工作正常。 但是,以下代碼行無法返回任何內容:

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

這可以在下面和鏈接的repo中/client/imports/routes/routes.js第39行找到。

有一次,我甚至嘗試創建一個新的Meteor方法'meets.query' ,它只會發布我需要的所有數據,(不安全地)避免出版物和訂閱的需要(它現在在/client/imports/api/meets.js第59行注釋掉了) /client/imports/api/meets.js )。 那也行不通。 通常,似乎客戶端無法從服務器接收任何數據,但從客戶端到服務器似乎工作(我可以將內容插入到我的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>
);

這是我發布數據的地方(`meet.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

WithTracker,檢查meteor docs https://guide.meteor.com/react.html#using-withTracker

例如,在此代碼中,對於APP組件,withTracker保持與訂閱同步的反應性,以及獲取集合的事物列表。

export default withTracker(() => {
  Meteor.subscribe('allThings')
  return {
    things: Things.find({}).fetch()
  }
})(App);

檢查我的流星反應樣板。

https://github.com/pkcwong/meteor-react-starter

我使用包meteor/react-meteor-data HOF withTracker是正確的解決方案。

在我的Created組件中,我有一個Tracker.autorun()其中包含錯誤,導致其他一切崩潰。 調用Meteor.subscribe(allMeets); 在我的路由器中,如上所述,async也沒有像這樣處理。

我發現withTracker很麻煩,但我從它的文檔中withTracker了很多靈感。 因此,我Created組件中的已編輯代碼現在包括:

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();
        }
      }
    });
  }

...我的router的代碼現在包括:

  <Route path="/meet" render={() => {
    const maybeId = queryString.parse(location.search).m;
    return <Created meetId={maybeId} />
  }} />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM