Jose Osorio
Jose Osorio

Reputation: 939

Meteor.JS: Subscribe no working

Im trying to subscribe my client side to my userFriends collection and Chrome's console display: userFriends is not defined

This is my code:

Server side...

userFriends = new Mongo.Collection("friends");
console.log(userFriends.find().fetch())
Meteor.publish("friends", function () {
    return userFriends.find();
});

NOTE: The console.log display in the terminal an empty array which is good

Client side...

Meteor.subscribe("friends");
console.log(userFriends.find().fetch())

NOTE: This is where Chrome's console display the error

what am I doing wrong ?

Thank you

UPDATE 1: Now I can see the Friends collection in Chrome's console, but i cant insert data. I have the subscribe in client.js inside my client folder and my insert code is in friend.js inside client folder aswell.

Upvotes: 1

Views: 3009

Answers (3)

thatgibbyguy
thatgibbyguy

Reputation: 4123

You have two correct answers but they do assume some knowledge for you. Here's what it looks like using Meteor's file structure (available at http://docs.meteor.com/#/full/structuringyourapp).

In your /lib (shared) directory

Make a file called "collections.js" and in it create your collection.

userFriends = new Mongo.Collection("friends");

I would instead do userFriends = new Mongo.Collection("userfriends"); so that your are always using the same word for your collection and you change the capitalization depending on if you're working on client or server. This is very helpful.

In Your /client directory

Make a file called "subscriptions.js" and in it subscribe to your collection.

Meteor.subscribe('friends');

In Your /server directory

Make a file called "publications.js" and in it publish your collection.

Meteor.publish('friends',function(){ return userFriends.find(); });

You don't need a fetch or anything there.

Essentially your code is failing because of where you're trying to house everything. What I've given you is three points of where you work. Client, Shared, Server. Set your app up that way and it will be easy to immediately figure out where you're working.

Hope that helps.

Upvotes: 2

saimeunt
saimeunt

Reputation: 22696

You need to declare the collection on both environments using shared code.

lib/user-friends.js

userFriends = new Mongo.Collection("friends");

client/user-friends.js

Meteor.subscribe("friends", function(){
  console.log(userFriends.find().fetch());
});

In the client, be aware that collection subscriptions are asynchronous by nature (there's network latency on the client, inherent to fetching the documents from the server).

This is why if you console.log your collection content right after Meteor.subscribeing you'll get [], but if you wait until the subscription is ready using a callback, documents will be displayed correctly.

Upvotes: 3

David Weldon
David Weldon

Reputation: 64342

The collection needs to be defined on both the client and the server. Typically this is done by placing the definition in a shared directory like lib:

lib/collections/user-friends.js

userFriends = new Mongo.Collection('friends');

Note the convention is to name the collection with the capitalized camel case version of the collection name. So calling it Friends would be more typical.

Upvotes: 3

Related Questions