![](/img/trans.png)
[英]Meteor Collection.find() blocks the entire application during working
[英]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.