Benjamin
Benjamin

Reputation: 70

Refreshing page with meteor iron router

Here is the problem :

I am currently programming a chatapp based on what i found on github (https://github.com/sasikanth513/chatDemo) I am refactoring it with iron-router.

When I go to the page (clicking on the link) I get an existing chatroom (that's what I want) When I refresh the page (F5) I get a new created chatroom ! (what i want is getting the existing chatroom ...)

Here is the code in ironrouter :

Router.route('/chatroom', {
  name: 'chatroom',
  data: function() {

    var currentId = Session.get('currentId'); //id of the other person
    var res=ChatRooms.findOne({chatIds:{$all:[currentId,Meteor.userId()]}});
    console.log(res);
    if(res){
      Session.set("roomid",res._id);
    }
    else{
      var newRoom= ChatRooms.insert({chatIds:[currentId, Meteor.userId()],messages:[]});
      Session.set('roomid',newRoom);
    }

  }
});

You can find my github repo with the whole project : https://github.com/balibou/textr

Thanx a lot !

Upvotes: 0

Views: 551

Answers (2)

SylvainB
SylvainB

Reputation: 4820

In meteor, the Session object is empty when the client starts, and loading/refreshing the page via HTTP "restarts" the client. To deal with this issue, you could persist the user's correspondent id in a Meteor.user attribute, so that you could easily do:

Router.route('/chatroom', {
  name: 'chatroom',
  data: function() {
    var currentId = Meteor.user().profile.correspondentId;
    var res=ChatRooms.findOne({chatIds:{$all:[currentId,Meteor.userId()]}});
    console.log(res);
    if(res){
      Session.set("roomid",res._id);
    }
    else{
      var newRoom= ChatRooms.insert({chatIds:[currentId, Meteor.userId()],messages:[]});
      Session.set('roomid',newRoom);
    }
  }
});

This would work, with the proper permissions, but I would recommend not allowing the direct update of that value on the client (I don't know if you want users to be able to override their correspondentId). So if you want to secure this process, replace all that code with a server method call, where your updates are safer.

Another (and more common case) solution was given by David Weldon, if you don't mind having ids in your URL (and therefore not a single url)

Upvotes: 1

David Weldon
David Weldon

Reputation: 64312

Your route data depends on Session variables which will be erased after a refresh. You have a few options but the easiest would be to put the room id directly into the route: '/chatroom/:_id'. Then you can use this.params._id to fetch the appropriate ChatRooms document. Note that you could still keep '/chatroom' for cases where the room doesn't exist, however you'd need to redirect to '/chatroom/:_id' after the insert.

Upvotes: 2

Related Questions