问题
I uninstalled the autosubscribe and restarted the meteor app. Since then, I haven't been able to access my collection data on the client.
Every question related to the empty array return comes up with the same answer: the subscribed data isn't available yet. But no matter how long I wait I never see the data on the client.
Server:
Meteor.startup(function () {
Meteor.publish("states", function () {
return states.find();
});
});
Logging states.find().fetch()
on the server spits out my states as expected.
On the client:
Meteor.subscribe("states", function(){
console.log(states, states.find(), states.find().fetch());
});
states
and states.find()
return objects as expected, .fetch()
returns an []
.
Waiting (even several minutes) then running states.find().fetch()
in the browser console gives me []
still.
Thoughts?
EDIT
Collection is declared outside of the isServer/isClient blocks (to utilize schemas).
states = new Meteor.Collection("states");
回答1:
I think you are getting []
because you are publishing the data on the startup, when isn't ready, lets make that subscribe reactive.
Tracker.autorun(function(){
Meteor.subscribe("states", function(){
console.log(states, states.find(), states.find().fetch());
});
});
OPTIONAL
There is no reason to declare the collections inside the isServer/isClient
if statements
Since you are starting with the Good practices (removing insecure/autopublish
packages)
Lets do the follow.
First Create the folder structure. (check meteor/structuringyourapp and this SO).
Inside the appName/lib/collection.js
put this code.
states = new Meteor.Collection("states");
//optional you can place this subscribe inside the appName/client/main.js
if(Meteor.isClient){
Meteor.subscribe("states", function(){
console.log(states, states.find(), states.find().fetch());
});
}
and on the appName/server/publish.js
Meteor.publish("states", function () {
return states.find();
});
来源:https://stackoverflow.com/questions/28890672/meteor-collection-fetch-returns-empty-array-but-is-subscribed