Commit fb4f28dd authored by Pedro Eduardo Trujillo's avatar Pedro Eduardo Trujillo
Browse files

Incluye Prerender para servir contenido a bots

Para los bots que requieren contenido "resuelto" (sin necesidad de
ejecutar Javascript) a modo de HTML estático, se incluye esta
funcionalidad mediante la librería prerender-node.

Comprueba si el usuario es un bot, y si no lo es o hubo algún problema,
responde con la versión normal de la aplicación.

Requiere de un servidor Prerender accesible para generar el contenido
(servicio aparte), referenciado mediante $PRERENDER_URL.
parent 13b88294
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
var packageJson = require('../package.json'),
let packageJson = require('../package.json'),
	version = packageJson.version,

	params = require('./params')(version),

	logging = require('./logging'),
	logger = logging.logger,

	cluster;

if (params.cluster) {
@@ -12,9 +13,9 @@ if (params.cluster) {
}

if (cluster && cluster.isMaster) {
	var numCpus = require('os').cpus().length;
	let numCpus = require('os').cpus().length;

	for (var i = 0; i < numCpus; i++) {
	for (let i = 0; i < numCpus; i++) {
		cluster.fork();
	}

@@ -23,20 +24,22 @@ if (cluster && cluster.isMaster) {
		logger.error('worker %i died (%s)', worker.process.pid, signal);
	});
} else {
	var express = require('express'),
	let express = require('express'),
		http = require('http'),

		metrics = require('./metrics')(logger, '/metrics'),
		prerender = require('./prerender')(logger),
		exposure = require('./exposure')(logger, params, version),

		port = params.port,
		debug = params.debug,
		pid = process.pid;

	var app = express();
	let app = express();

	logging.registerAppLogger(params, app);
	metrics.registerAppMetrics(app);
	prerender.registerAppPrerender(app);
	exposure.exposeApp(app);

	http.createServer(app).listen(port, function() {
+4 −4
Original line number Diff line number Diff line
var commander = require('commander');
let commander = require('commander');

module.exports = function(version) {

@@ -12,13 +12,13 @@ module.exports = function(version) {
		.showSuggestionAfterError()
		.parse(process.argv);

	var commanderOpts = commander.opts();
	let commanderOpts = commander.opts();

	return {
		useBuilt: commanderOpts.useBuilt,
		cluster: commanderOpts.cluster,
		debug: commanderOpts.debug,
		port: commanderOpts.port,
		lang: commanderOpts.defaultLang
		lang: commanderOpts.defaultLang,
		port: commanderOpts.port
	};
};

app/prerender.js

0 → 100644
+36 −0
Original line number Diff line number Diff line
let prerenderNode = require('prerender-node'),
	logger;

let prerenderUrl = process.env.PRERENDER_URL;

prerenderNode.set('prerenderServiceUrl', prerenderUrl)
	.set('afterRender', afterRender);

function afterRender(err, req, _prerender_res) {

	if (err || !prerenderUrl) {
		let agent = req.get('User-Agent');

		if (!prerenderUrl) {
			logger.warn('"PRERENDER_URL" is undefined, serving non-static content to bot "%s"', agent);
		} else {
			logger.warn('Prerender error found, serving non-static content to bot "%s". %O', agent, err);
		}

		return { cancelRender: true };
	}
}

function registerPrerender(app) {

	app.use(prerenderNode);
}

module.exports = function(loggerParameter) {

	logger = loggerParameter;

	return {
		registerAppPrerender: registerPrerender
	};
};
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
    "morgan": "1.10.0",
    "prom-client": "14.0.1",
    "pug": "3.0.2",
    "prerender-node": "3.6.0",
    "response-time": "2.3.2",
    "winston": "3.7.2"
  },
+5 −0
Original line number Diff line number Diff line
@@ -3293,6 +3293,11 @@ platform@~1.3.6:
  resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7"
  integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==

prerender-node@3.6.0:
  version "3.6.0"
  resolved "https://registry.yarnpkg.com/prerender-node/-/prerender-node-3.6.0.tgz#5c8a0a19cc26f45a749b3b00598466f21c16d287"
  integrity sha512-jwxTq6Zat0w8+rIo6w1axkpfZZUid2zxVjCpZtgtRtuPf+3/VrXwKb2iM+kdwv6iSAXwwuEtnet9epR1NN/obA==

pretty-bytes@^5.3.0:
  version "5.6.0"
  resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"