ForgeTotal.js 5
fr

Total.js 5

Transférer des requêtes vers un autre serveur

Total.js 5 · total5@0.0.19 proxygatewayintegrations Exécutée avec Total.js 5

PROXY(prefix, target) transfère à un autre serveur toutes les requêtes situées sous un préfixe d'URL et renvoie la réponse en flux, de sorte qu'une application Total.js peut se placer devant plusieurs services. Il s'exécute avant les routes : un préfixe géré par PROXY() n'atteint donc jamais ROUTE(). La requête est transmise avec sa méthode, ses en-têtes et son corps ; les en-têtes x-forwarded-for, x-forwarded-url et x-forwarded-host informent le serveur en amont de la requête d'origine. PROXY(prefix) sans cible supprime le proxy.

L'objet renvoyé configure le proxy : .copy(type) choisit quelle partie du chemin est envoyée en amont (voir plus bas), .timeout(ms) limite l'attente, .check(fn) n'applique le proxy que lorsque fn(ctrl) renvoie true et .before(uri, ctrl) peut modifier la requête sortante, par exemple pour ajouter un en-tête.

.copy() accepte none (par défaut), extend ou replace. Avec none, le serveur en amont ne reçoit que le chemin de la cible plus la query string : /none/a/b/?q=1 devient /base/?q=1 pour la cible http://host/base/. Avec extend, le reste du chemin de la requête est ajouté au chemin de la cible : /extend/a/b/?q=1 devient /base/a/b/?q=1, ce que vous voulez pour une passerelle. replace se comporte comme extend quand la cible a son propre chemin ; quand la cible n'est qu'un hôte, il envoie le reste du chemin sans la query string, préférez donc extend.

Pour une seule route, utilisez $.proxy(url) : il envoie la requête courante (méthode, query string, corps et en-têtes) à url et renvoie la réponse du serveur en amont avec son code de statut.

controllers/proxy.js
const Http = require('http');

// A small upstream server that reports what it received
Http.createServer(function(req, res) {
	res.writeHead(200, { 'content-type': 'application/json' });
	res.end(JSON.stringify({ method: req.method, url: req.url, token: req.headers['x-token'] || null, forwarded: !!req.headers['x-forwarded-url'] }));
}).listen(9411, '127.0.0.1');

// One proxy per copy mode, to see the difference (the target has the path /base/)
PROXY('/none/', 'http://127.0.0.1:9411/base/');
PROXY('/extend/', 'http://127.0.0.1:9411/base/').copy('extend');
PROXY('/plain/', 'http://127.0.0.1:9411/base/').copy('replace');

// Everything below /service/ goes to the upstream, and a header is added on the way
PROXY('/service/', 'http://127.0.0.1:9411/').copy('extend').before(function(uri, ctrl) {
	uri.headers['x-token'] = 'secret';
});

exports.install = function() {
	ROUTE('GET /single/', single);
};

function single($) {
	$.proxy('http://127.0.0.1:9411/from-route/');
}