Search code examples
javascriptmeteormeteor-blazeprerender

Meteor Getting Prerender.io Working


I am trying to get prerender working on both local and prod. I feel like I have tried all implementations. I am still getting no static html in the body when using: ?_escaped_fragment_= at the end of the URL.

Here is my current Meteor implementation:

Meteor.startup(() => {
  var prerenderio = Npm.require('prerender-node');
  var token;
  var serviceUrl;
  var protocol;
  var settings = Meteor.settings.PrerenderIO;


  token = process.env.PRERENDERIO_TOKEN || (settings && settings.token);
  protocol = process.env.PRERENDERIO_PROTOCOL || (settings && settings.protocol);

  // service url (support `prerenderServiceUrl` (for historical reasons) and `serviceUrl`)
  serviceUrl = settings && (settings.prerenderServiceUrl || settings.serviceUrl);
  serviceUrl = process.env.PRERENDERIO_SERVICE_URL || serviceUrl;


  if (token) {
    if (serviceUrl) prerenderio.set('prerenderServiceUrl', serviceUrl);
    prerenderio.set('prerenderToken', token);
    if (protocol) prerenderio.set('protocol', protocol);

    prerenderio.set('afterRender', function afterRender(error) {
      if (error) {
        console.log('prerenderio error', error); // eslint-disable-line no-console
        return;
      }
    });

    WebApp.rawConnectHandlers.use(prerenderio);
  }
});

I have my settings file set up as so:

"PrerenderIO": {
  "serviceUrl": "http://localhost:3033/",
  "token": "mytoken"
},

Same for prod but without the serviceUrl. I did get the prerender server up and the page renders....but its still the default Meteor script rendered page. I also tried: <script> window.prerenderReady = false; </script> and then set it to true after my API content has loaded via our router (using ButterCMS for site content.

I have of course also added: <meta name="fragment" content="!"> to our sites head.

Prerender is still saying its not seen our token get used. I think I could be missing something obvious here....but not certain what it is.


Solution

  • That seems like the prerender middleware is not being run. Does Meteor leave the rawConnectHandlers in the order that they are added? Can you try this:

    WebApp.rawConnectHandlers.use(function(req, res, next) {
        console.log('before prerender:', req.url)
    });
    WebApp.rawConnectHandlers.use(prerenderio);
    

    And see if you see any output in your logs for that showing what the incoming URL looks like. If you are accessing the ?_escaped_fragment_= URL, you should see get printed in that console.log statement.

    Feel free to email us at support@prerender.io with a URL if you'd like us to help test.