46 lines
2.5 KiB
JavaScript
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);
|
|
});
|