meteorclient-serversingle-page-applicationiron-router

Meteor - How can I get server data from a URL parameter?


I'm trying to return different data based off a URL parameter on a route in MeteorJS.

From a nodejs background, I would just do this:

testPage = function (req, res, next) {
    //Got parameter query from url
    console.log('Getting at /testPage/:query '+req.params.query);

    //do something with that parameter, say make an HTTP call or query database
    var newThing = req.params.query+"hi";

    // render the page
    var data = {
        foo: newThing
    };
    res.render('testPage', data);
};

Meteor doesn't support server side rendering, so that's out. I'm still wrapping my head around the single-page client rendering of Meteor; how should I go about this in Meteor?

My first attempt (using IronRouter):

Router.route('/testPage/:query', function () {
    console.log("Got param at /testPage/:query "+this.params.query);
    if(Meteor.isServer){
        console.log("This code may never be called?");
        //Otherwise, make an HTTP call 
        //  and then somehow pass the data back to the client...
    }
    this.render("query");
});

Is this something I can do with reactive variables? Or perhaps make an AJAX call from client to separate server endpoint?


Solution

  • The canonical pattern for this with iron-router is to subscribe to data using the route parameter(s):

    Router.route('/foo/:bar',{ // Route takes a single parameter
      name: 'foo',
      waitOn: function(){
        return Meteor.subscribe('fooPublication', this.params.bar);
      }
    });
    

    In this example this.params.bar is the route's only parameter. It is passed as an argument to Meteor.subscribe. The server can use that parameter in deciding what to publish back to the client. The waitOn guarantees the data will be available on the client when the template renders.