todos-contra-el-fuego-web/imports/startup/server/prerender.js
2018-02-17 08:52:50 +01:00

46 lines
2.5 KiB
JavaScript

/* global WebApp */
import { Meteor } from 'meteor/meteor';
import prerenderIO from 'prerender-node';
// NOTE: Fetch as Google needs the /?_escaped_fragment_=
// https://webmasters.stackexchange.com/questions/72819/fetch-as-google-doesnt-find-the-html-snapshot-for-my-ajax-content
// https://forums.meteor.com/t/any-guide-for-prerender-node-and-your-own-server-on-meteor/22054/9
const settings = Meteor.settings.PrerenderIO;
// https://github.com/dferber90/meteor-prerender/blob/master/server/prerender.js
const token = process.env.PRERENDERIO_TOKEN || (settings && settings.token);
const protocol = process.env.PRERENDERIO_PROTOCOL || (settings && settings.protocol);
// service url (support `prerenderServiceUrl` (for historical reasons) and `serviceUrl`)
let serviceUrl = settings && (settings.prerenderServiceUrl || settings.serviceUrl);
serviceUrl = process.env.PRERENDERIO_SERVICE_URL || serviceUrl;
Meteor.startup(() => {
/* TODO if (!__meteor_runtime_config__.ROOT_URL.match(/www|stg|app/)) return; */
prerenderIO.set('prerenderToken', token);
if (serviceUrl) prerenderIO.set('prerenderServiceUrl', serviceUrl);
prerenderIO.set('prerenderToken', token);
if (protocol) prerenderIO.set('protocol', protocol);
prerenderIO.set('beforeRender', (req, done) => {
if (Meteor.isDevelopment) console.log('\nprerender before', req.headers, '\n\n');
/* This method is intended to be used for caching, but could be used to save analytics or anything else you need to do for each crawler request. If you return a string from beforeRender, the middleware will serve that to the crawler (with status 200) instead of making a request to the prerender service. If you return an object the middleware will look for a status and body property (defaulting to 200 and "" respectively) and serve those instead. */
done();
});
prerenderIO.set('afterRender', (err, req, prerender_res) => {
/* This method is intended to be used for caching, but could be used to save analytics or anything else you need to do for each crawler request. This method is a noop and is called after the prerender service returns HTML. */
if (err) {
console.log('prerenderio error', err);
return;
}
if (Meteor.isDevelopment) console.log('prerender after', req.url, '\nheaders:', req.headers, '\nres complete:', prerender_res.complete, prerender_res.statusCode, prerender_res.statusMessage, '\nres headers:', prerender_res.headers, '\nres body', prerender_res);
});
WebApp.rawConnectHandlers.use(prerenderIO);
// console.log('\nprerender service:', settings);
});